簡體   English   中英

是否會導致在函數參數傳遞的視圖上添加子視圖的保留周期?

[英]Would it cause retain cycle that add a subview on a view passed by parameter of a function?

例如:

// CustomViewClass

- (void)showOnView: (UIView*)view {
    [view addSubview: self.customView];
}

然后在另一個類中調用此方法,如視圖控制器的viewDidLoad

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.customViewClass showOnView: self.view];
}

我將視圖控制器的視圖傳遞給CustomViewClass ,如上所述。

我的問題是:它會導致某種保留周期嗎?

這些視圖是通過弱參數引用的嗎?
或者它很好。

如果有人在SwiftObjective-C中解釋它,將非常感激。

什么是保留周期? - 這是兩個對象保持彼此引用並被保留的條件,它創建了一個保留周期,因為兩個對象都試圖相互保留,從而無法釋放。

在這種情況下, self.customViewClass保持對它的引用self.viewself.view不保留對任何參考self.customViewClass 其中引用self.customViewClassself ,而不是self.view

所以當然, 它不會導致保留周期

不相信我? 🤣 - 通過嘗試在dealloc方法中記錄某些內容來自行檢查。

解雇CustomViewController ,如果調用dealloc的代碼並記錄某些內容,則表示此處沒有保留周期。 如果不是,則導致保留周期。

例如

- (void)dealloc {
  NSLog(@"BOOM RIGHT ANSWER!!!");
}

當兩個類具有指向彼此的對象時發生內存泄漏。例如

 class A{
   var object_b = B()
 }

 class B{
   var object_a = A()
 }

現在考慮你的情況:// CustomViewClass

- (void)showOnView: (UIView*)view {
    [view addSubview: self.customView];
}

你的“view”對象是局部變量.CustomViewClass doest不引用superview“view”。

現在,當customview添加到superview時:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.customViewClass showOnView: self.view];
}

當CustomViewClass的showOnView函數調用superview時,只需添加子視圖CustomViewClass視圖。

要查找內存泄漏,請始終在視圖和viewController類中添加deinit函數,以便可以確定是否已取消分配類。

deinit {
    print("deinit called " + "Class name")
}

這不會導致保留周期。 它是對象的單向引用,其中父視圖在輔助(自定義)視圖中具有引用。 但是,父視圖中沒有該輔助視圖的引用。 因此,除非出現這種情況,否則就保留周期而言,您是非常安全的,並且不需要父視圖的弱引用。

暫無
暫無

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

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