iOS 從父視圖移除方法樣本

來源:互聯網
上載者:User

視圖結構

在iOS應用中,視圖的結構是樹型資料結構,以這種結構來控制視圖顯示,這種資料結構有一個很好的優點:

層級關係分明,並且方便傳遞事件。從根節點出發,通過分葉節點向下擴充,同一枝的上一個節點就是下一個節點的superview,下一個節點就是上一個節點的subview。每個應用程式有一個主Window,這個Window就是根節點。

removeFromSuperview

每一個View都和視圖結構和響應者鏈有直接的關係,但是這篇文章不打算著重的講這兩個方面,主要講removeFromSuperview方法。將當前視圖從其父視圖移除,需要調用removeFromSuperview方法。下面是蘋果對於這個API的官方定義:

Unlinks the receiver from its superview and its window, and removes it from the responder chain.

譯:把當前View從它的父View和視窗中移除,同時也把它從響應事件操作的響應者鏈中移除。

removeFromSuperview就是一個視圖節點刪除的操作,執行這個方法,就等於在樹形結構中找到該節點,從樹型資料結構中刪除該節點及其子節點,而並非只是刪除該節點自己。同時,另一個操作就是把該對象從響應者鏈中移除。

執行removeFromSuperview方法,只是該視圖不在螢幕中顯示,並沒有將該視圖從記憶體中移除。所以我們如果需要使用該視圖,不需要再次建立,而是直接addSubview就可以了。

對於這個API,蘋果並沒有給出過多的解釋,只是簡單的描述了一下這個API,以及說明了這個API的注意點。

記憶體陷阱

那如果是這樣,那就遇到一個和我們之前認知不太相同的答案了。具體是什麼問題,還是需要我們自己寫代碼驗證,於是我基於上面描述的測試環境,寫了一些關於視圖的測試代碼。


UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
[self.view addSubview:view];
[view release];
[view removeFromSuperview];
// 多次調用remove方法
[view removeFromSuperview];

經過我的測試發現,調用removeFromSuperview方法後引用計數並沒有增加,調用完之後還是會release的。我們之前看到的引用計數的增加,是因為系統的隱藏操作導致的。之前在MRC時期經常發現retainCount不準確,這主要是因為iOS系統API的引用、或自動釋放池導致的,所以retainCount並不能當做可靠的參考。

所以,如果調用多個release,還是會崩潰的,始終要相信iOS的MRC記憶體管理原則,這才是可靠的。可以多次調用removeFromSuperview方法,在已經移除父視圖後,其他多餘的調用不會改變任何引用計數。對於addSubview:方法也是一樣的

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.