iOS 对象内存释放时机:当对象的引用计数为0时对象被释放

所以如下代码

__weak NSObject * a = [[NSObject alloc] init];

这个对象在创建完赋完值后会被立即释放,因为它的引用计数是0

 

然后说说 ARC:

ARC的原理是在适当的位置插入 retain,release,autorelease, 在插入 release 的地方对象的引用计数立即减一,但不一定会被释放,因为有可能还有别的指针指向这个对象。在插入 autorelease 的地方对象的引用计数不会立即减一,而是将这个对象注册到 autoreleasepool 中,在 autoreleasepool 释放的时候这个对象的引用计数才被减一。在普通的 iOS 应用中,由于是基于 runloop 的事件循环,每个 runloop 循环都会被 autoreleasepool 包裹,所以 autorelease 的对象会在每个 runloop 循环结束后引用计数减一(引用计数为0的时候就被释放)。所以说普通对象的内存释放跟 runloop 没有关系,引用计数为0的话就会被释放,只有被 autorelease 的对象的内存释放才跟 runloop 有关系。所以正常情况下 ARC 不会有忘了发 release 消息这种内存泄露,只有当对象之间存在循环引用的时候,或者被无限循环的timer强引用时候才会有内存泄露。

 

所以问题来了,ARC 什么时候会插入 autorelease?一种情况是在有 return 语句的函数,如果这个函数不是以alloc,init开头,并且也不包含copy,mutableCopy,那么返回值会被autorelease,否则返回值不会被autorelease

posted on 2018-08-14 16:59  ximenchuixie  阅读(167)  评论(0编辑  收藏  举报