oc使用引用计数来管理内存,可加减。想让某个对象继续存活,就增加其引用计数,用完了就递减。引用计数为0时,表示没人继续使用该对象,就可以销毁了。
“垃圾回收机制”在MAC OS X 10.8之后废弃,在IOS上从未支持过“垃圾回收机制”
Retain 递增保留计数
release 递减保留计数
autorelease 稍后清理“自动释放池”时,再递减保留计数
对象被创造出来,保留计数至少为1。如果想让他继续存活,使用retain增加保留计数.
属性存取方法中的内存管理
如果属性为“strong关系”,则设置的属性值会保留。
顺序很重要,假如还未保留新值就把旧值释放了,两个值又指向了同一个对象。先执行的release操作就可能导致系统将对象永久回收。实例变量就变成了野指针。
自动释放池
“垃圾回收机制”在MAC OS X 10.8之后废弃,在IOS上从未支持过“垃圾回收机制”
Retain 递增保留计数
release 递减保留计数
autorelease 稍后清理“自动释放池”时,再递减保留计数
对象被创造出来,保留计数至少为1。如果想让他继续存活,使用retain增加保留计数.
如果调用release之后,基于某些原因,其引用计数会降到0,被系统收回。如果再次调用会导致崩溃。为避免在不经意间使用无效对象,用完release后会清空指针,这样保证不会出现“野指针”。
NSMutableArray *array = [[NSMutableArray alloc] init];
NSNumber *number = [[NSNumber alloc] initWithInt:1337];
[array addObject:number];
[number release];
number = nil;
属性存取方法中的内存管理
如果属性为“strong关系”,则设置的属性值会保留。
例如:
-(void)setFoo:(id)foo{
[foo retain];
[_foo release];
_foo = foo;
}
顺序很重要,假如还未保留新值就把旧值释放了,两个值又指向了同一个对象。先执行的release操作就可能导致系统将对象永久回收。实例变量就变成了野指针。
自动释放池
autorelease,此方法会在稍后递减计数,通常是在下一次“事件循环”时递减。
-(NSString *)stringValue {
NSString *str = [[NSString alloc] initWithFormat:@"ssss: %@", self];
return [str autorelease];
}
此时返回的str对象其保留计数比期望多1,alloc会令保留计数+1。保留计数多1,必须设法将其抵消。但是不能在方法内释放str,否则方法还没返回,系统就把str回收了。这里应该用autorelease,它会稍后释放对象。此方法可以保证对象在跨越“方法调用边界”后一定存活。实际上,释放操作会在清空最外层的自动释放池时执行。
autorelease能延长对象生命期,使其在跨越方法调用边界后依然可以存活一段时间。
保留环
使用引用计数机制时,经常要注意“循环引用”,就是互相引用多个对象导致内存泄露。采用“弱引用”来解决问题。
总结:
1.引用计数机制通过可以递增递减的计数器来管理内存。对象创建好之后,其保留计数至少为1。若保留计数为正,则对象继续存活。当保留计数降为0时,对象被销毁。
2.在对象生命周期中,其余对象通过引用来保留或释放此对象。保留与释放操作分别会递增及递减保留计数。