autorelease是自动释放,看上去像ARC,其实更相似与C语言的自动变量(没有任何修饰符的局部变量)的特性。框架
C语言的自动变量特性:程序执行时,若自动变量超出其做用域,该自动变量将被自动废弃。oop
{ int a; } //由于超出变量做用域 自自动变量 int a 被废弃,不能再访问
autorelease 会像 C 的自动变量那样来对待对象实例,当超出其做用域(至关于变量做用域)时,对象的release 实例方法 会被调用。spa
1.生成并持有NSAutoreleasePool 对象.net
2.调用已分配对象的autorelease 实例方法code
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对象进行生成、持有、废弃处理。get
使用autorelease 会带来的问题:若是大量产生autorelease的对象时,又不废弃NSAutoreleasePool对象,那么生成的对象就不能被释放,所以有时会产生内存不足的现象。it
解决办法:有必要在适当的地方生成、持有或废弃NSAutoreleasePool对象。
autorelease实例方法的本质:调用 NSAutoreleasePool 的 addObject 类方法。
也就是说调用autorelease 方法 会将调用的对象放入 自动释放池 中
- (id)autorelease{ [NSAutoreleasePool addObject:self]; }
@autoreleasepool{ id __autoreleasing obj = [[NSObject alloc] init]; }
在ARC有效时,用 @autoreleasepool块 替代 NSAutoreleasePool类,
用附有 __autoreleasing 修饰符的变量 替代 autorelease 方法。
注意:加不加 __autoreleasing 修饰符 均可以。 为何呢??
待续。。。