2011-03-03 50 views
16

對於iOS開發人員來說,代表幾乎在任何地方都可以使用。property「assign」and「retain」for delegate

而且看起來,我們需要使用「分配」,而不是保留委託這樣

的原因是爲了避免Why are Objective-C delegates usually given the property assign instead of retain?

我看到了很多的代碼循環迴路問題他們仍然使用「保留」。所以這裏的問題是,如果我們使用retain作爲委託,我們是否仍然會遇到循環問題?

感謝

回答

26

documentation說:

保留一個對象創建一個強大的,並且有一個對象不能被釋放,直到所有的強引用被釋放。如果兩個對象保留在彼此沒有對象不斷被釋放,因爲它們之間的連接不能被打破

舉個例子,讓我們考慮實現的UITableViewDelegate協議一個UITableViewController。 UITableView被它的視圖控制器保留,儘管UITableView不保留它的委託。

正如上面的文檔中所述,UITableViewController只會在所有強引用被釋放後才能完成其釋放。由於將UItableViewController作爲委託的UITableView不保留它,所以當UItableViewController的所有者調用release時,保留計數將變爲零,並調用dealloc方法。

現在設想UITableView保留它的委託。 UITableViewController的保留計數至少爲+2。一個與它的所有者和另一個與UITableView。當UITableViewController的所有者調用它的釋放時,保留計數將變爲+1,並且不會像預期的那樣變爲零,因此直到保留計數達到零時纔會調用dealloc方法。爲了達到零,UITableViewController需要釋放它的UITableView,然後釋放它的委託(UITableViewController)。因爲UITableViewController只會在釋放這個時刻的時候纔會處理它的視圖(UITableView),因爲保留計數不會下降到+1。

(讓我們考慮內存警告以及其他任何可能的情況下,不採取...我剛纔看到的ViewController /查看是不是在這個例子中是最好的選擇,但我已經寫了太多了。:))

這有道理嗎?

+0

是的,非常感謝,非常感謝!在你的情況下,A是UITableViewController,B是TableView,所以唯一正確的方法是在TableView中爲委託使用「分配」。考慮另一種常見的情況,A是ViewController,B是另一個ViewController,A創建一個新的B,並且在B中爲委託使用「retain」,並且A可以釋放B,所以在這種情況下,「retain」對於B代表是否有意義? – Forrest

+0

沒有得到它。你說A創建B,A使用B作爲委託,所以A.viewController(retain)= B,A.delegate(assign)= B.或者A是B上的委託,所以A. viewController(retain)= B,B.delegate(assign)= A?哪一個是這種情況? – vfn

+0

關於A和B的上下文來自鏈接爲什麼Objective-C的代表通常賦予屬性賦值而不是保留? – Forrest

相關問題