Objective-C的内存管理学习记录

来源:互联网 发布:网络作家收入怎么算 编辑:程序博客网 时间:2024/05/21 20:50
Objective-C是采用引用计数来进行内存管理的。每个类多一个实例(生成对象),其引用计数就会+1,少一个实例(释放对象),其引用计数就会-1,当没有实例了,引用计数为0,就要废弃对象了。

引用计数的内存管理

引用计数式内存管理的思考方式大概就是“某处某物有多少”,具体分点就是:1.自己生成的对象,自己所持有。2.非自己生成的对象,自己也能持有。3.不再需要自己持有的对象时释放。4.非自己持有的对象无法释放。

1、自己生成的对象,自己持有:
首先,给方法命名的时候要注意规范,一般使用以下名称开头的方法名意味着自己生成的对象只有自己持有:
alloc、new、copy、mutableCopy
比如:allocMyObject。
自己持有是什么意思呢?我个人理解就是可以霸道的对这个对象为所欲为,挥之即来挥之即去,当然,还得对它负责任,把它生成出来了,就得自己把它释放了。

// 自己生成了一个NSObject对象给了一个名字叫obj的变量,从此,自己就持有了这个对象了id obj = [[NSObject alloc] init];// 不用的时候记得释放哦[obj release];

2、非自己生成的对象,自己也能持有:
我的理解是用非alloc、new、copy、mutableCopy这四个方法取得的对象,但是通过一些方法(retain)获得了对象的持有权

// 自己生成了一个NSMutableArray对象,但是只是暂借给名字叫obj的变量,obj并没有这个对象的持有权,所以obj千万不能把这个对象搞丢了,也不能随便把这个对象释放了id obj = [NSMutableArray array];// 通过retain方法,obj也拥有了持有权了~也可以爱干嘛干嘛了[obj retain];// 不用的时候记得释放哦[obj release];

3、不再需要自己持有的对象时释放:
1、release方法,看上面第二点。
2、autorelease方法,用这个方法可以使取得的对象存在,但是自己不持有对象,但是这个对象在超出指定的生存范围的时候能够自动并正确地释放(自己调用release方法)。就是autorelease可以使自己持有的对象注册到autoreleasepool里然后就变成自己不持有的,然后在时间的长河里和pool一起释放~
release和autorelease的区别

-(id)object{    // 自己生成了一个NSObject对象给了一个名字叫obj的变量,自己持有这个对象    id obj = [[NSObject alloc] init];    // 现在只知道有这个对象了,并不持有了    [obj autorelease];    return obj;}

还可以通过retain方法将autoreleasepool里的对象变为自己持有。
autorelease会在实例超出作用域时掉用对象实例的release实例方法,那个作用域是可以人为调整的。
NSAutoreleasePool对象的生命周期
只要不废弃NSAutoreleasePool对象,那么里面的对象就不能被释放,当autorelease的对象大量产生时就睡发生内存不足的问题。所以有必要在适当的地方生成、持有、废弃NSAutoreleasePool对象。

4、无法释放非自己持有的对象
用alloc、new、copy、mutableCopy方法生成并持有的对象、通过retain持有的对象,在不需要的时候要负责任的把这些对象释放掉,可是不能越界的把自己不持有的对象给释放掉了,不然会crash的。

参考书籍:《Objective-C高级编程 iOS与OS X多线程和内存管理》
博文地址:http://terrylovesolar.com/reference-counting-in-objective-c/

1 0
原创粉丝点击