(原创)用代码来说明,更易于理解:delegate用assign而不使用retain

为什么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。

 

posted @ 2012-08-17 11:18  流浪的剑客  阅读(459)  评论(0)    收藏  举报