前提是ARC有效
- 函数在返回值得时候, 会将其内部变量全部清空释放;
- 由alloc/new/copu/mutableCopy方法返回值取得的对象自己持有, 对象默认修饰符为__strong;
- 除了2中所生成的对象, 其他都是非自己生成但是自己持有的对象;
- 对象在没有明确指定修饰符时, 默认为__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对象相同;