内存pipe理与代表?

内存pipe理与委托,这是我的理解,我不保留委托,我有点不确定如何处理委托如果视图被卸载(通过viewDidUnload),后来重新创build(通过viewDidLoad)?

@property(assign) SomeClass *someDelegate; 

 - (void)viewDidLoad { [super viewDidLoad]; someDelegate = [[SomeClass alloc] init]; [someDelegate setDelegate:self]; } -(void)viewDidUnload { [super viewDidUnload]; [self setSomeDelegate:nil]; } -(void)dealloc { [super dealloc]; } 

PS:我可能在错误的轨道上,我只是想把我的头转过来…

欢呼加里

如果您为自己的财产使用分配,则不会在对象上调用保留。

这意味着你绝对不应该调用release或者autorelease!

你dealloc中的行

 [someDelegate release]; 

将在未来的某个时候导致崩溃 – 你应该删除它。 你不需要关心dealloc方法中的赋值属性。

你的线

 [self setSomeDelegate:nil]; 

不会泄漏。


但是,你好像在你的viewDidLoad方法中有[[someDelegate alloc] init] 。 这是不寻常的; 委托人是外部客体,而不是你自己制造的。 在你的情况下,它不是一个真正的委托,它只是一个为你做某事的对象 – 你应该重新命名它,并将属性更改为一个保留(并记住释放它在dealloc中)。

目前,如果您的媒体资源设置为(分配),而其他人设置了媒体资源,则会泄露您的初始代理人。 如果你只在这个类中使用委托,也许它不应该是一个属性? 如果你只是希望能够从课堂外读取,你可以使用(只读)而不是assign(并将[self setSomeDelegate:nil]改为someDelegate=nil;

你在viewDidUnload中设置委托为nil的行消除了你在第二个评论中提出的问题 – 你删除委托,所以当你再次viewDidLoad时,你的委托已经是零:)

这可能会让我们明白为什么

避免保留代表的原因是您需要避免保留周期:

创buildBA将自己设置为B的代表… A由其所有者发布

如果B保留了A,则A不会被释放,因为B拥有A,因此A的dealloc永远不会被调用,导致A和B都泄漏。

你不应该担心A离开,因为它拥有B,因此在dealloc中被清除。