黑马程序员-循环引用问题和weak

时间:2022-07-21 13:44:33

使用weak reference(弱引用)来避免retain cycle
对一个对象发送retain消息会创建对这个对象的强引用(strong reference)。如果两个对象都有一个强引用指向对方,那么就形成了一个环(retain cycle)。这个环使得这两个对象都不可能被release。

例子:

int main(int argc, const charchar * argv[]) { 

    Person *p = [[Person alloc] init]; 

    Dog *dog = [[Dog alloc] init]; 

    [p setDog:dog];//dog计数:2 

    [dog setPerson:p];//person计数:2 

    [p release]; //person计数:1 

[dog release];//dog计数:1 

当在dog和person的property方法中利用retain时就会 导致循环使用。

弱引用(weak reference)指的是一种non-owning(非拥有)的关系,比如简单指针赋值关系。使用弱引用避免了retain cycle。但是需要注意的是,弱引用不能保证弱引用指向的对象是否存在,所以发消息给这个对象时一定要小心。如果弱引用指向的对象已经释放,那么发送消息给它会导致程序崩溃。所以,需要一点点额外的操作来使用弱引用所指的对象。比如,当向notification center注册一个对象时,notification center保存了一个指向这个对象的弱引用。当这个对象被回收时,需要通知下notification center。
在getter方法中避免循环套用,避免在getter方法中再用getter方法。例如if(self.age=nil)的错误判断。应为self.age也是一个getter方法。导致循环使用。