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

本文通过代码实例解释了在Objective-C中使用assign而非retain作为delegate属性类型的原因,避免了对象泄露的问题。

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

 

转载于:https://www.cnblogs.com/xierenli/archive/2012/08/17/2643712.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值