您的位置:首页 > 编程语言

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

2012-08-17 11:18 369 查看

为什么delegate 用 assign 而不使用 retain。

网络上有介绍说明,但不是很直观明了,为了更易于理解,本人用代码来说话。

先定义两个类:AAA

@interface AAA : NSObject

@property (nonatomic, retain) id delegate;

@end

@implementation AAA
@synthesize delegate;

- (void)dealloc
{
[delegate release];
[super dealloc];
}


再来BBB:

@interface BBB : NSObject

@property (nonatomic, retain) id delegate;

@end

@implementation BBB
@synthesize delegate;

- (void)dealloc
{
[delegate release];
[super dealloc];
}


如果有下面操作(.count表达为对象的引用计数器):

{
AAA aaa = [[AAA alloc] init];   // aaa.count = 1
BBB bbb = [[BBB alloc] init];   // bbb.count = 1

aaa.delegate = bbb; // bbb.count = 2
bbb.delegate = aaa; // aaa.count = 2

//do someting..........
[self dosomething];

[aaa release];  // aaa.count - 1  即结果:aaa.count = 1;
// 由于引用计数器不为零,所以不会调用AAA类中的dealloc方法,
// 所以不会调用[delegate release]; 此时delegate为bbb,所以bbb.count = 2

[bbb release];  //同理,bbb.count - 1  即结果:bbb.count = 1;
// 由于引用计数器不为零,所以不会调用BBB类中的dealloc方法,
// 所以不会调用[delegate release]; 此时delegate为aaa,所以aaa.count = 1
}


所以最终aaa,bbb的各自引用计数器还是为1,引用计数器为1就不会调用dealloc方法来释放里面的delegate,

造成aaa与bbb永远存在内存中,导致内存的泄漏。

所以delegate要用assign,不能用retain。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: