autorelease

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

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

{
  int a;
}

//因为超出变量作用域 自自动变量 int a 被废弃,不能再访问

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

 

autorelease具体使用方法:

1.生成并持有NSAutoreleasePool 对象

2.调用已分配对象的autorelease 实例方法

3.废弃NSAutoreleasePool 对象

 

NSAutoreleasePool 对象的生存周期 相当于 C语言的自动变量作用域,对于所有调用过autorelease实例方法的对象,在废弃NSAutoreleasePool 对象时,都将调用release实例方法。

110848_cbZ2_2472425.png

 

用源代码表示如下:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

id obj = [[NSObject alloc] init];

//将obj对象加入pool中
[obj autorelease]; 

//等同于[pool release]
[pool drain]; 

在cocoa 框架中,相当于程序主循环的NSRunLoop在程序可运行的地方,对NSAutoreleasePool对象进行生成、持有、废弃处理。

113002_1jDK_2472425.png

使用autorelease 会带来的问题:如果大量产生autorelease的对象时,又不废弃NSAutoreleasePool对象,那么生成的对象就不能被释放,因此有时会产生内存不足的现象。

解决办法:有必要在适当的地方生成、持有或废弃NSAutoreleasePool对象。

 

autorelease实例方法的本质:调用 NSAutoreleasePool 的 addObject 类方法。

也就是说调用autorelease 方法 会将调用的对象放入 自动释放池 中 

- (id)autorelease{
  [NSAutoreleasePool addObject:self];
}

 

 

ARC

@autoreleasepool{

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

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

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

 

注意:加不加 __autoreleasing  修饰符  都可以。 为什么呢??

待续。。。

转载于:https://my.oschina.net/u/2472425/blog/967447

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值