2010-05-12 50 views
0

如果我釋放持有對我需要的變量的引用的對象release,那足夠了嗎?或者我必須在遏制層級的每個級別release?我擔心我的邏輯來自與垃圾回收器合作太久。我可以只發布頂級對象(iPhone)嗎?

例如,我分配到UIPickerView實例的該屬性用手而不是用IB

@property(nonatomic, assign) id<UIPickerViewDelegate> delegate 

因爲它是一個assign財產,我不能只release基準後,我分配給它。當我終於releaseUIPickerView情況下,做我需要做的是:

[singlePicker.delegate release]; 
[singlePicker release]; 

或第二線是否足夠?

另外:這些assign屬性是常態還是主要用於Interface Builder?我認爲retain屬性是預期的正常情況。

回答

2

該屬性被宣佈爲assign而不是retain由於某種原因 - 代表不屬於他們的持有者,他們也不會爲其調用release。否則,循環引用會出現問題。但是,如果您擁有它們,則必須在您作爲代理使用的對象上調用釋放。

如果代表被保留,設想以下情況:

  • a需要b作爲代表,保留b
  • b需要a作爲代表,保留a

現在你有一個循環引用 - 沒有醜陋的清除代碼,明確地告訴他們釋放他們的委託,這兩個對象都將不起作用r被釋放。

的主題是Delegation and the Cocoa Application Frameworks處理:

委派對象沒有(也不應該)保留其代表。但是,委託對象(通常是應用程序)的客戶端負責確保他們的委託人接收委派消息。要做到這一點,他們可能必須將代理保留在內存託管代碼中。這種預防措施同樣適用於數據來源,通知觀察員和行動目標。請注意,在垃圾收集環境中,由於保留週期問題不適用,因此對委託的引用很強大。

+0

謝謝你。你介意簡單提一下爲什麼它會成爲循環引用的問題嗎? – 2010-05-12 20:47:00

+0

@yar:新增,是否清除它? – 2010-05-12 20:51:40

+0

是的,完全。我從來不知道爲什麼自動垃圾收集是如此重要。我想我現在得到它:) – 2010-05-12 21:00:56

相關問題