为什么delegate 用 assign 而不使用 retain。
网络上有介绍说明,但不是很直观明了,为了更易于理解,本人用代码来说话。
先定义两个类:AAA
1 @interface AAA : NSObject 2 3 @property (nonatomic, retain) id delegate; 4 5 @end 6 7 8 @implementation AAA 9 @synthesize delegate; 10 11 - (void)dealloc 12 { 13 [delegate release]; 14 [super dealloc]; 15 }
再来BBB:
1 @interface BBB : NSObject 2 3 @property (nonatomic, retain) id delegate; 4 5 @end 6 7 8 @implementation BBB 9 @synthesize delegate; 10 11 - (void)dealloc 12 { 13 [delegate release]; 14 [super dealloc]; 15 }
如果有下面操作(.count表达为对象的引用计数器):
1 { 2 AAA aaa = [[AAA alloc] init]; // aaa.count = 1 3 BBB bbb = [[BBB alloc] init]; // bbb.count = 1 4 5 aaa.delegate = bbb; // bbb.count = 2 6 bbb.delegate = aaa; // aaa.count = 2 7 8 //do someting.......... 9 [self dosomething]; 10 11 [aaa release]; // aaa.count - 1 即结果:aaa.count = 1; 12 // 由于引用计数器不为零,所以不会调用AAA类中的dealloc方法, 13 // 所以不会调用[delegate release]; 此时delegate为bbb,所以bbb.count = 2 14 15 [bbb release]; //同理,bbb.count - 1 即结果:bbb.count = 1; 16 // 由于引用计数器不为零,所以不会调用BBB类中的dealloc方法, 17 // 所以不会调用[delegate release]; 此时delegate为aaa,所以aaa.count = 1 18 }
所以最终aaa,bbb的各自引用计数器还是为1,引用计数器为1就不会调用dealloc方法来释放里面的delegate,
造成aaa与bbb永远存在内存中,导致内存的泄漏。
所以delegate要用assign,不能用retain。