autorelease

autorelease是自动释放,看上去像ARC,其实更相似与C语言的自动变量(没有任何修饰符的局部变量)的特性。框架

C语言的自动变量特性:程序执行时,若自动变量超出其做用域,该自动变量将被自动废弃。oop

{
  int a;
}

//由于超出变量做用域 自自动变量 int a 被废弃,不能再访问

autorelease 会像 C 的自动变量那样来对待对象实例,当超出其做用域(至关于变量做用域)时,对象的release 实例方法 会被调用。spa

 

autorelease具体使用方法:

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];
}

 

 

ARC

@autoreleasepool{

  id __autoreleasing obj = [[NSObject alloc] init];
 
}

在ARC有效时,用 @autoreleasepool块 替代 NSAutoreleasePool类, 

                     用附有 __autoreleasing 修饰符的变量  替代  autorelease 方法。

 

注意:加不加 __autoreleasing  修饰符  均可以。 为何呢??

待续。。。

相关文章
相关标签/搜索