上篇讲述了ARC(自动内存管理),这篇了解一下ARC之前的故事。
1.引用计数 – Objective-C中的内存管理 举个例子:有一条狗(对象生成),一个人拿条绳索牵着它,它的引用计数为1,又来了一个人,又用一根绳索牵着它,它的引用计数就是2,再来一个人再系上引用计数就是3。当一个人离开的时候,它就放开了手中的绳索,此时它的引用计数为2,当最后一个人放开绳索的时候引用计数为0,狗狗就被释放了。
2.内存管理的思考方式
自己生成的对象自己持有非自己生成的对象自己也可以持有不再需要自己持有的对象的时候释放非自己持有的对象无法释放对象操作与Objective-C方法的对应
对象操作 ——> Objective-C方法 生成并持有对象 —–> alloc/new/copy/mutableCopy等方法 持有对象 —–> retain 方法 释放对象 —–> release 方法 废弃对象 —–> dealloc 方法
3.思考方式详解
生成并持有对象(alloc/new/copy/mutableCopy等方法) 只以alloc为例 /** * 自己生成并持有对象 */ NSObject *obj = [[NSObject alloc] init]; /** * 自己持有对象 */ 持有对象(retain 方法) 上面有自己生成并持有对象 这里举个非自己生成并持有对象 /** * 取得非自己生成并持有对象 */ id obj = [NSMutableArray array]; /** * 取得的对象存在但自己不持有 */ /** * 取得非自己生成并持有对象 */ id obj = [NSMutableArray array]; /** * 取得的对象存在但自己不持有 */ [obj retain]; /** * 自己持有对象 */那自己如何写非自己生成但存在的对象方法呢,以下便是啦
- (id)object{ id obj = [[NSObject alloc] init]; /** * 自己持有对象 */ [obj autorelease]; /** * 取得的对象存在但自己不持有 */ return obj; } 释放对象(release 方法) /** * 自己生成并持有对象 */ NSObject *obj = [[NSObject alloc] init]; /** * 自己持有对象 */ [obj release]; /** * 释放对象 指向对象的指针仍然被保留在变量obj中,貌似能够访问 但对象一经释放绝对不可访问 */其中release方法一经调用对象立即被释放,autorelease则是使对象在超出指定的生存范围时能够自动并正确地释放
废弃对象(dealloc 方法)–总结自《Objective-C高级编程 - iOS与OS X多线程和内存管理》 黎华 译
