Objective-C在管理内存时,遵循一套简单的规则。
每一个对象都有一个名为"retainCount"的变量,它表示该对象有多少个引用。
class *obj = [class alloc];//alloc会导致retainCount为1
[obj retain];//retainCount++ 通常在对象赋值之后这样做,代表它多了一个引用。
[obj release];//retainCount-- 通常在使用完该对象的时候这样做。
当 retainCount为0时,运行时环境会通过调用[obj dealloc]来释放对象占用的内存。
下面 看一个例子:
Test *t1 = [[Test alloc] initWithNum:12];//创建了一个对象,t1是该对象的引用,由于调用了alloc此时retainCount为1
Test *t2 = t1;//此时t2也要使用该对象
[t2 retain];//t2要使用对象 就必须要retain,此时retainCount为2
[t1 release];//t1这时不用该对象了 就release了,也就是放弃了对象的使用权,此时retainCount为1
[t2 release];//t2使用完了 就release 此时retainCount为0,立刻会调用dealloc来释放内存
其实,规则很简单。谁使用谁就先retain,用完在release就可以了。这样就不会内存泄露了。
oc中存在一个autorelease pool,其实它是一个NSMutableArray。
把对象加入到autorelease pool:
[obj autorelease];
autorelease在释放的时候会给所有的对象发送release,如果该对象的retainCount为1,那么结果导致 retainCount为0,然后运行时就会调用对象的dealloc,以此来实现内存释放。
如果你
[obj retain];
之后没有
[obj release];
在autorelease pool 释放的时候一样会内存泄露!记住autorelease pool只是给对象发送一次release而已!