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对象相同;

猜你喜欢

转载自blog.csdn.net/Batac_Lee/article/details/110206102