2015-05-02 47 views
2

子視圖具有超視圖的引用,而超視圖也具有子視圖的引用(子視圖)。UIView如何防止保留週期?

我想知道爲什麼這不會導致保留週期?

+1

一個參考文獻很薄弱。 – rmaddy

+0

我假設一個參考必須是星期。我怎麼也弄不清哪一個弱。 – DavidLiu

+0

對超視圖的引用很弱。 – rmaddy

回答

2

UIViewsuperview屬性聲明爲

@property(nonatomic, readonly) UIView *superview; 

在Objective-C,如果沒有不同所有權說明符 聲明的屬性 assign默認 strong默認引進ARC的,然而,該UIKit標題似乎不使用ARC,所以此屬性最像assign。還要注意,由於該屬性是隻讀的,因此源中最有可能是自定義getter,因此屬性中的所有者說明符不一定會告訴我們任何內容。可以肯定的是,蘋果已經以避免保留週期的方式實現了它。

assign相當於__unsafe_unretained,這是一個非歸零弱引用。這意味着它不保留該對象,但當對象被釋放時不會被設置爲nil。這比weak具有更高的性能(因爲它不需要檢查和歸零),但是不安全,因爲如果被引用的對象被釋放,您可能正在訪問垃圾內存。

另請注意,該屬性聲明爲readonly,這意味着它實際上可以實現爲一種方法,該方法返回一個私有實例變量,或完成其他我們不知道的其他內容。基本上,重要的是你可以假設這個屬性不保留它指的對象

在今天的新代碼中,您應該使用weak而不是assign

+0

在Objective-C中,聲明沒有不同所有權說明符的屬性默認情況下應該是'strong',對吧?我認爲這實際上是因爲'@property(nonatomic,readonly,copy)NSArray * subviews',所以父母不會因爲'copy'屬性而保留子視圖。 – DavidLiu

+0

另外,'assign'屬性不執行任何類型的內存管理。這是基本數據類型的默認行爲。 'assign'不等於'__unsafe_unretained'。 – DavidLiu

+0

@DavidLiu'__unsafe_unretained'和'assign'實際上是相同的,請參見[本答案](http://stackoverflow.com/a/14669490/834998)。 – Greg