OC大话ARC与对象的生命周期

前提是ARC有效

  1.  函数在返回值得时候, 会将其内部变量全部清空释放;
  2. 由alloc/new/copu/mutableCopy方法返回值取得的对象自己持有, 对象默认修饰符为__strong;
  3. 除了2中所生成的对象, 其他都是非自己生成但是自己持有的对象;
  4. 对象在没有明确指定修饰符时, 默认为__strong;
-(void)test {

    id obj1 = [[NSObject alloc] init];
    
    id obj2 = [NSMutableArray array];
    
    id __autoreleasing obj3 = [[NSObject alloc] init];

    id __autoreleasing  obj4 = [NSMutableArray array];

    @autoreleasepool {

        id obj5 = [[NSObject alloc] init];
    
        id obj6 = [NSMutableArray array];
    
        id __autoreleasing obj7 = [[NSObject alloc] init];

        id __autoreleasing  obj8 = [NSMutableArray array];
    }
}

obj1对象的生命周期:

        函数调用时, 生成变量obj1, 指向生成的NSObject对象, 默认修饰符为__strong, 将obj1加入引用计数表中, 当函数调用结束, 将要释放变量obj1时, 内部会先调用release, 释放obj1指向的对象, 这是判断计数为0, 释放该对象, 释放变量obj1;  //此处如果实在MRC环境下, 变量obj1被正确释放, 但是obj1指向的对象并没有被释放, 引起内存泄漏;

obj2对象的生命周期:

      函数调用时, 生成变量obj2, 指向生成的NSMutableArray对象, obj2对象非自己生成, 自己持有的对象, 会被编译器加入到最近一次创建的自动释放吃autoreleasepool(pool)中, 并会在当前的runloop迭代结束时释放, 当函数调用完毕, 变量obj2被释放, obj2指向的对象, 并不会立马释放, 释放时间取决于pool什么时候被释放;

obj3对象的生命周期:

      obj3对象也是伴随着函数被调用而创建, 被__autoreleasing修饰符修饰, 会被加入到autoreleasepool中, 和obj2对象的情况相同;

obj4对象的生命周期:

      obj4对象虽然也是被__autoreleasing修饰, 但是对象本身就是非自己创建, 而持有的对象, 会在array方法返回的时候, 被编译器加入到最近创建的pool中, 这里是加入到系统创建的pool中, 和obj2相同;

obj5对象的生命周期:

        与对象obj1情况相同;

obj6对象的生命周期:

        obj6对象在生成由array返回的时候, 会被编译器加入到最近创建的pool中, 此时为自己创建的一个pool中, 该pool的生命周期为到下大括号结束, 释放pool,  pool中的对象也会被释放, 

运行到pool的下大括号时, pool生命结束, pool中的所有对象被释放, 此时变量obj6并未被释放, 只有函数返回值得时候, 变量obj6被释放;

obj7对象的生命周期:

      obj7对象与obj6对象相同;

obj8对象的生命周期:

        obj8对象与obj6对象相同;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值