autorelease是自动释放,看上去像ARC,其实更类似与C语言的自动变量(没有任何修饰符的局部变量)的特性。
C语言的自动变量特性:程序执行时,若自动变量超出其作用域,该自动变量将被自动废弃。
{ int a;}//因为超出变量作用域 自自动变量 int a 被废弃,不能再访问
autorelease 会像 C 的自动变量那样来对待对象实例,当超出其作用域(相当于变量作用域)时,对象的release 实例方法 会被调用。
autorelease具体使用方法:
1.生成并持有NSAutoreleasePool 对象
2.调用已分配对象的autorelease 实例方法
3.废弃NSAutoreleasePool 对象
NSAutoreleasePool 对象的生存周期 相当于 C语言的自动变量作用域,对于所有调用过autorelease实例方法的对象,在废弃NSAutoreleasePool 对象时,都将调用release实例方法。
用源代码表示如下:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];id obj = [[NSObject alloc] init];//将obj对象加入pool中[obj autorelease]; //等同于[pool release][pool drain];
在cocoa 框架中,相当于程序主循环的NSRunLoop 或 在程序可运行的地方,对NSAutoreleasePool对象进行生成、持有、废弃处理。
使用autorelease 会带来的问题:如果大量产生autorelease的对象时,又不废弃NSAutoreleasePool对象,那么生成的对象就不能被释放,因此有时会产生内存不足的现象。
解决办法:有必要在适当的地方生成、持有或废弃NSAutoreleasePool对象。
autorelease实例方法的本质:调用 NSAutoreleasePool 的 addObject 类方法。
也就是说调用autorelease 方法 会将调用的对象放入 自动释放池 中
- (id)autorelease{ [NSAutoreleasePool addObject:self];}
ARC
@autoreleasepool{ id __autoreleasing obj = [[NSObject alloc] init]; }
在ARC有效时,用 块 替代 NSAutoreleasePool类,
用附有 __autoreleasing 修饰符的变量 替代 autorelease 方法。
注意:加不加 __autoreleasing 修饰符 都可以。 为什么呢??
待续。。。