可能重複:
In dealloc method set any delegate to nil is needed or not needed有關委託快捷的查詢,並將它們設置爲nil,
在ARC如果類Foo
擁有伊娃和伊娃的委託被設置爲Foo
的時候,一個良好的安全預防措施將伊娃的代表設置爲nil
,dealloc
或僅在某些情況下使用此預防措施?
可能重複:
In dealloc method set any delegate to nil is needed or not needed有關委託快捷的查詢,並將它們設置爲nil,
在ARC如果類Foo
擁有伊娃和伊娃的委託被設置爲Foo
的時候,一個良好的安全預防措施將伊娃的代表設置爲nil
,dealloc
或僅在某些情況下使用此預防措施?
這取決於伊娃。如果Foo
擁有它「專有」並且ivar不適用於其他職業,則不需要_ivar.delegate = nil;
在dealloc
。但是,如果該對象也打算用於其他類中,則最好將該委託設置爲零。但是,這在Cocoa開發中非常罕見。
答案中提到的另一種方法是始終保證安全,並將delegate
設置爲nil
。但我不會推薦這個。有時候,通過離開委託引用,你可能會發現一個泄露的對象,試圖聯繫其擁有它的「死亡」代表。
是的。即使你大多數代表沒有被保留(除了一些時間生命的類,例如CAAnimation和NSURLConnection),我遇到了一個對象嘗試訪問死亡委託的情況(最具體地說,使用NSFetchedResultsController)。委託應該是unsafe_unretained的,所以當你的對象被釋放時它們應該是零,因此使它成爲冗餘來消除dealloc方法上的委託,但看着NSFetchedResultsController的情況,最好是安全而不是遺憾。
將代表設置爲零是一種很好的做法。但是如果你聲明委託是「弱」的,那麼它不保留一個保留計數,因此它不需要設置爲零,因爲反正它不會做任何特殊的事情。之所以設置爲零,是因爲後來調用它不會導致任何奇怪的行爲。 – 2012-08-13 22:35:09