一、循环引用和总结(内存管理的经典问题)
对象A retain对象B,同时对象B retain对象A。这时两个对象A和B都没有办法得到释放。这种情况我们称之循环引用。如下示:
//B类中设置A- (void)setA:(A *)a{ if(_a != a) { [_a release]; _a = [a retain]; }}- (void)dealloc{ [_a release]; [super dealloc];} | //A类中设置B- (void)setB:(B *)b{ if(_b != b) { [_b release]; _b = [b retain]; }}- (void)dealloc{ [_b release]; [super dealloc];} |
二、内存管理总结
当你使用new、alloc或copy方法创建一个对象时。该对象的引用计数为1。当不在使用该对象时,你要负责向该对象发送一条release或者autorelease消息。这样,该对象将在其使用对象结束时销毁。
你通过任何其他方法获得一个对象时,则假设该对象的引用计数为1,而且已经被设置为自动释放,你不需要执行任何方法来释放对象。如果你打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它。
如果你保留了某个对象,你需要释放或自动释放该对象。必须保持retain方法和release方法的使用次数相等。
除了alloc、new或copy之外的方法创建对象都被声明了autorelease。谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release。