標籤:
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的使用