簡體   English   中英

ARC關於網點和網點集合的弱引用和強引用?

[英]ARC weak and strong references with outlets and collection of outlets?

我將獲得有關ARC的更多信息,以及薄弱的參考資料:

實際上,如果我有:

@interface
@property (weak) IBOutlet UIButton * button
@property (weak) UIView *subview
@end

@implementation

-(BOOL) viewDidLoad
{
    UIView *aSubView= [[UIView alloc]....];
    [self.view addSubview:aSubview];
    self.subview = aSubview;
}

對按鈕有較弱的引用是正常的,因為其超級視圖對此按鈕具有較強的引用。

現在,我以編程方式添加UIView ,我也放置了一個弱引用,因為當我將這個subView添加到超級視圖中時,將會有一個強引用。 第一個問題:這是一個好方法嗎?

現在,我的真正問題出在該集合的第二個源代碼上。 我可以在IBOutletCollection放什么?

而且,如果我想保留以編程方式添加的一系列視圖,則不能這樣做,因為NSArray保留了強大的引用和視圖的超級視圖,因此會出現一些泄漏。 我如何在不泄漏的情況下擁有子視圖的NSArray

@property (?) IBOutletCollection .....
@property (?) NSArray *subviews

-(BOOL) viewDidLoad
{
    ?
}

出口通常是弱引用,因為視圖由其超級視圖擁有。 如果使它們成為弱引用,則要擺脫視圖對象,您所需要做的就是將其從其父視圖中刪除,並且出口將被清零。

以編程方式創建的子視圖示例是同一回事,而使其變弱則是個好主意。

您的NSArray子視圖需要成為強引用,否則將發布該數組。 IBOutletCollection也是如此,它實際上只是系統維護的數組。

如果要在釋放擁有的視圖控制器之前釋放它們,則需要自己從這些數組中刪除視圖。

您可能可以使用NSPointerArray創建自己的奧特萊斯集合等效項,它不會保留傳遞給它的指針。 但是,您將需要小心,因為它也不會將釋放的項目歸零,因此,如果您從視圖中刪除了項目但未刪除其在NSPointerArray中的條目,則您將得到僵屍。

考慮所有事情,我建議只使用一個常規的可變數組,並對內容進行自己的整理,以將其從數組的超級視圖中刪除。

對於第一個問題,是的,這是推薦的子視圖屬性策略。 關於第二個問題,我不確定您要問什么。 如果您正在尋找IBOutletCollection,那么這是一個很好的教程 如果不是,請說明IBOutletCollection存在的問題。

1)以編程方式添加子視圖時,可以將弱引用作為屬性保留在視圖控制器中。

2)IBOutletCollection實際上是由預處理器刪除的,對編譯器沒有任何意義。 這只是XCode中的提示,即與該屬性相關聯的插座集合。

3)這是討論使用NSArray存儲弱引用的頁面:

對ARC下的對象的弱引用(__unsafe_unretained)的NSArray

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM