• iOS内存管理


    在返回一个对象时常常要返回一个autorelease 对象,因为objectC 对象都是动态内存,没有
    栈的概念,所以不能像C/C++一样返回一个对象到栈,只能用autorelease对象。


    什么时候用属性?
      1. 把成员做为public.
      2. outlet 一般声明为属性( 这个内存于系统控制,但我们还是应该做一样操作,后面会讲)
      3. 如果很多函数都需要改变这个对象 ,或这个函数会触发很多次,建议使用属性。我们看看属性函数展开后是什么样子:

    // assign
    -(void)setTestObject :(id)newValue{
        testObject= newValue;
    }
    // retain
    -(void)setTestObject  :(id)newValue{
        if (testObject!= newValue) {
            [testObject release];
            testObject= [newValue retain];
        } 
    }
    // copy
    -(void)setTestObject :(id)newValue{
        if (testObject != newValue) {
            [testObject release];
            testObject = [newValue copy];
        }
    }
    asssign 相于于指针赋值,不对引用计数进行操作,注意原对象不用了,一定要把这个设置为nil
    retain 相当于对原对象的引用计数加1
    copy 不对原对象的引用计数改变,生成一个新对象引用计数为1
    注意:
      self.testObject 左值调用的是setTestObject 方法. 右值为get方法,get 方法比较简单不用说了
      而 真接testObject 使用的是成员变量
      self.testObject = [[testObject alloc] init];   // 错  reatin 两次
      testObject =   [NSArray objectbyindex:0];  //错 不安全,没有retain 后面release会出错
                                                                      如果testObject已有值也会mem leak     

    自动管理对象
       IOS 提供了很多static(+) 创建对象的类方法,这些方面是静态的,可以直接用类名
    调用如:
       NSString *testString = [NSString stringWithFormat:@"test" ];
       testString 是自动管理的对象,你不用relese 他,他有一个很大的retain count, release后数字不变。




    http://blog.csdn.net/weiwangchao_/article/details/7376189

  • 相关阅读:
    实践测试登录功能的思路与原理解析(基于 Spring Security)
    测试人如何突破职业瓶颈,实现指数级成长?| 测试大咖在线沙龙
    往期优秀文章
    webRTC初接触,网页获取媒体音视频
    Guava Cache源码浅析
    打着维护用户利益旗号的厮杀
    HDFS资源管理器源码发布
    Ext复制grid里某一列的值
    不引入外部文件也可以显示图片
    页面嵌入Windows Media Player需要注意的
  • 原文地址:https://www.cnblogs.com/pencilCool/p/4756426.html
Copyright © 2020-2023  润新知