内存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中被清除。