iOS strong與weak的使用

來源:互聯網
上載者:User

標籤:

strong修飾的屬性是強指標類型的,weak修飾的屬性是弱指標類型的

ARC對於記憶體中的對象管理機制,當某個對象沒有被強指標指向的時候,該對象就會被銷毀。

所以不適當的使用strong和weak修飾屬性容易造成記憶體泄露。

OC對象(繼承NSObject的類建立的對象)用strong修飾。

UI控制項連線的時候都會用weak修飾,給了大家一個假象。就是UI控制項屬性都是用weak修飾的。這種說法是錯誤的

當我們連線的時候,storyboard會根據圖層結構分析,判斷是否使用weak修飾,驗證:

任何一個控制器都會對應一個根視圖:

在stroyboard的表現形式為

所以,當前的圖層結構為

每個UIUiew都是一個容器,可以存放其它的UIView,所以UIView有一個subviews屬性

subviews是一個數組。數組是一個集合,當我們把某個Object Storage Service到集合中的時候,集合就會對該對象有一個強指向。

這裡的copy涉及到深拷貝和淺拷貝的知識。深拷貝會建立新的對象,並且把新的對象的地址賦值給subviews屬性

淺拷貝不會建立新的對象,知識拷貝當前數組對象的地址,並且把地址賦值給subviews屬性。無論是深拷貝,淺拷貝。subviews都是一個強指標。

所以,當前的層級關係是

所以,當我們向stroyboard中拖拽控制項的時候。在storyboard中的層級表現形式為

這時,viewController已經有一個強指標間接指向UISwitch對象了。當我們連線的時候,設定的viewController的屬性,如果此時再用strong修飾switch屬性。

就會出現這樣的情況

viewController對同一個對象強引用了兩次,不符合ARC記憶體管理機制。所以storyboard分析以後,預設我們使用weak修飾連線的屬性。

此時,圖層結構為

下面,我把控制器內建的view給刪除掉。此時self.view= nil;所以強指標指向就斷開了 

這個時候,我拖拽一個imageView控制項,

這個時候,imageView沒有被強指標指向,所以,當我們給imageView拖線的時候,storyboard分析,viewController沒有對imageView強引用,此時viewcontroller需要強指標指向。

所以storyboard就會建議我們使用強指標。此時的層級關係是

所以,當我們給imageview拖線的時候:

所以,UI控制項通過連線並不一定是用weak修飾的。面試的時候經常會被問到,一定要記住!!!不要掉進面試官的坑裡。

 

iOS strong與weak的使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.