2012-08-13 31 views
0

可能重複:
In dealloc method set any delegate to nil is needed or not needed有關委託快捷的查詢,並將它們設置爲nil,

在ARC如果類Foo擁有伊娃和伊娃的委託被設置爲Foo的時候,一個良好的安全預防措施將伊娃的代表設置爲nil,dealloc或僅在某些情況下使用此預防措施?

+0

將代表設置爲零是一種很好的做法。但是如果你聲明委託是「弱」的,那麼它不保留一個保留計數,因此它不需要設置爲零,因爲反正它不會做任何特殊的事情。之所以設置爲零,是因爲後來調用它不會導致任何奇怪的行爲。 – 2012-08-13 22:35:09

回答

0

這取決於伊娃。如果Foo擁有它「專有」並且ivar不適用於其他職業,則不需要_ivar.delegate = nil;dealloc。但是,如果該對象也打算用於其他類中,則最好將該委託設置爲零。但是,這在Cocoa開發中非常罕見。

答案中提到的另一種方法是始終保證安全,並將delegate設置爲nil。但我不會推薦這個。有時候,通過離開委託引用,你可能會發現一個泄露的對象,試圖聯繫其擁有它的「死亡」代表。

0

是的。即使你大多數代表沒有被保留(除了一些時間生命的類,例如CAAnimation和NSURLConnection),我遇到了一個對象嘗試訪問死亡委託的情況(最具體地說,使用NSFetchedResultsController)。委託應該是unsafe_unretained的,所以當你的對象被釋放時它們應該是零,因此使它成爲冗餘來消除dealloc方法上的委託,但看着NSFetchedResultsController的情況,最好是安全而不是遺憾。

+0

你已經交換了。 '__unsafe_unretained'不會刪除指針,'弱'確實。如果你已經聲明所有「__unsafe_unretained」認爲它正在消除事情,那可能就是你看到這種行爲的原因。 – Jim 2012-08-13 22:35:30

+0

感謝您的澄清。然而,這些地方是我有這些問題,我沒有宣佈這些代表。 – J2theC 2012-08-13 22:40:15