内存管理遵循的原则:
1:自己生成的对象,默认自己持有;
2:非自己生成的对象,默认不持有;
3:不再需要自己持有的对象时释放;
4:非自己持有的对象无法释放。
总结一下就是谁生成谁释放,谁引用谁释放。
什么是自己的生成的对象?
使用以alloc/new/copy/mutableCopy开头命名(驼峰规则)的方法就是自己生成的对象,除此之外的方法都是非自己生成的对象,如[NSMutableArray array]中的array方法。
以下是示例:
自己产生的对象
自己生成对象,自己释放对象
调用release之后马上释放
对于上述自己产生的对象自己持有并释放很好理解,接下来看看非自己产生的对象是如何处理的。
非自己产生的对象
非自己生成对象返回持有对象
调用方法
这个时候调用者就会困惑了,不是自己产生的对象我到底要不要释放?根据以上的实现是需要调用者主动释放的,可是调用者又说了,明明不是我生成的对象凭什么要我释放?为了解决这个困惑就有了这个原则,非自己产生的对象默认不持有,不需要你释放。那不用调用者释放由谁来释放呢?为了解决这个问题就引入了autorelease机制。
非自己生成的对象由autorelease管理ARC帮我们做了那些事?
主要是苹果用__strong,__weak,unsafe_unretained,__autoreleasing这几个修饰符帮我们做了那些事。
id类型和对象类型的默认修饰符__strong
__strong修饰的对象会强引用对象,它不仅在变量作用域还是还是在赋值上都能帮我们管理对象,在超出作用域是会默认调用[id release]方法,赋值会处理调用[id retain],[id release]方法。
比较特别的是在初始化时有两种情况要区分:自己生成的对象以及非自己生成的对象。
自己生成的对象已经持有不需要再retain 非自己生成的对象没有持有需要retain在__strong强引用非自己生成对象,上述是为了便于理解直接写了[person retain],实际上苹果内部有自己的实现逻辑,但最终效果是一样的。其他几个修饰符大同小异,就不写了。
与CoreFoundation的转换
__bridge、__bridge_retained、__bridge_transfer
delloc调用的方法
_objc_rootDealloc、objc_dispose、objc_destructInstance、objc_clear_deallocating
网友评论