美文网首页
自动释放池

自动释放池

作者: 盖小聂 | 来源:发表于2018-10-08 10:38 被阅读0次

release与autorelease

对象在调用release方法的时候引用计数会立刻减1。
而对象在调用autorelease方法时,对象的引用计数会在稍后的时间内减1,通常是在当前线程下一个“事件循环”。autorelease方法在方法返回对象的时候特别有用。如果方法中创建的对象在返回前执行release方法,那有可能对象还没有返回就被销毁了。使用autorelease方法,可以保证对象在返回的时候依然存活,也无需调用者手动释放对象,因为在当前线程的下一个事件循环,对象的引用计数会自动减1.autorelease方法可以延长对象的生命周期,可以跨越方法调用边界之后存活一段时间。

自动释放池

1、释放对象有两种方式,一种是调用release方法,调用release方法的对象引用计数会立刻递减;另一种是调用autorelease方法,将对象加入到“自动释放池”中,自动释放池中的对象会在稍后的某个时候被释放,清空自动释放池时系统会向池中的对象发送release消息。
2、自动释放池创建于左花括号,并于右花括号处自动清空,花括号范围内的对象,会于花括号的末尾处收到release消息。
3、自动释放池可以降低应用程序的内存峰值。
4、我们不需要担心自动释放池的创建问题。主线程或者GCD创建的线程,默认都有自动释放池,每一次执行事件循环的时就会将其清空

MRC的自动释放池与ARC的自动释放池的区别

1、ARC的自动释放池更轻量级,可以在每一次for循环中创建并清空自动释放池;而MRC的自动释放池要重量级一些,通常多次循环才清空一次自动释放池。
2、ARC的自动释放池在使用上面更安全,在自动释放池块外面调用自动释放池内的对象,将无法通过编译;但是MRC中在自动释放池执行完drain方法之后再使用自动释放池中的对象编译时不会有问题,运行时可能会造成应用程序奔溃。

MRC

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
id object = [self createObject];
[pool drain];
[self useObject: object]; //不安全

ARC

@autoreleasepool {
    id object = [self createObject];
}
[self useObject: object];//编译时报错

嵌套的自动释放池对象的释放时机

自动释放池中的对象会在最近一个自动释放池块的右括号结束的位置被释放

相关文章

网友评论

      本文标题:自动释放池

      本文链接:https://www.haomeiwen.com/subject/joydaftx.html