2010-10-19 62 views
0

問題這裏有一個內存管理問題的問題。有關subview保留superview在目標C

說,我有一個觀點A,它有一個指針指向其子視圖B.我用@property(nonatomic, retain)引用視圖B.

現在子視圖B,我需要一個指針指向回它的父答:所以我用另一個@property(nonatomic, retain)指代它的超級視圖A.

這是我的關注,我讀了一篇文章Hold Me, Use Me, Free Me關於保留和釋放目標c的東西。它提到「保留週期」。所以它說,一個子視圖不需要保留它的超級視圖,實際上如果這樣做是多餘的。這是否意味着在我的例子中,子視圖B只需要使用@property(nonatomic)參照其超級視圖A?謝謝!

順便說一句,如果我沒有在@property中寫視圖A的保留,我需要在dealloc方法中使用[viewA release]嗎?

回答

3

每個子視圖都有一個指向其超級視圖的指針。它由NSView課程管理。見-[NSView superview]。所以你可以使用[self superview]self.superview並完全忽略內存管理。

如果您因爲任何原因想繼續操作,您需要指定superview屬性是assign屬性以避免警告。您也不會在-dealloc中發佈它,因爲您從未保留它。

簡而言之:子視圖不擁有他們的超級視圖。

如果您要爲iOS編碼,只需將NSView替換爲UIView並重新讀取即可。

+0

那麼,如果視圖A是一個UIViewController類(UIResponder-> NSObject的子類)呢?我試圖添加一個子視圖,這是一個UIImageView(UIView的子類)。所以當我在子視圖類中使用self.superview時,它沒有給我UIViewController類(我想要的),但給了我UIViewController.view。所以我怎麼能得到UIViewController類。 (實際上它是UIImageView的UIViewController.view類的addSubview,而不是UIViewController類本身,所以在subView類中,self.superView沒有指向UIViewController類) – sbs 2010-10-19 02:31:20

+0

確切地說:視圖控制器本身不是自己的一種觀點,而是支配一種觀點。一個觀點是通過設計無視其控制器。它與控制器的通信由響應者鏈調節:用戶交互將應答者鏈起泡,直到遇到處理者。你可以使用' - [UIResponder nextResponder]'來自己走這條鏈。由於視圖控制器擁有其受控視圖,因此您仍然需要警惕導致保留週期 - 您仍然不希望子視圖保留其超級視圖的控制器。 – 2010-10-19 03:33:28

0

現在子視圖B,我需要一個指針 點回到它的父A.

你已經有了一個。使用[self superview]

0

你的UIView不應該需要UIViewController。你想做什麼?如果還沒有,請閱讀關於Model-View-Controller樣式的Apple文檔。

+0

我的視圖實際上是ViewController的視圖,它是在我創建基於視圖的項目時自動創建的。 – sbs 2010-10-19 04:18:21