是否会导致在函数参数传递的视图上添加子视图的保留周期?

时间:2018-06-15 11:29:07

标签: ios objective-c swift

例如:

// CustomViewClass

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

然后在另一个类中调用此方法,例如视图控制器viewDidLoad

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

我将视图控制器的视图传递给CustomViewClass,如上所述。

我的问题是:会导致某种保留周期吗?

这些视图是否通过弱参考参数传递? 或者它很好。

如果有人在 Swift Objective-C 中解释它,我们将非常感激。

3 个答案:

答案 0 :(得分:5)

  

什么是保留周期? - 当2个对象彼此保持引用并被保留时,它会创建一个保留周期,因为两个对象都试图相互保留,从而无法释放。

在这种情况下,self.customViewClass会引用self.view,但self.view不会引用self.customViewClass。其中self.customViewClass的引用是self,而不是self.view

当然, 它不会导致保留周期

不相信我? - 尝试在dealloc方法中记录内容,自行检查。

解雇CustomViewController后,如果调用dealloc内的代码并记录某些内容,则表示此处没有保留周期。如果不是,则会导致保留周期。

例如

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

答案 1 :(得分:1)

当两个类具有彼此指向的对象时发生内存泄漏。例如。

 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视图。

为了查找内存泄漏,请始终在views和viewController类中添加deinit函数,以便确定是否已取消分配类。

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

答案 2 :(得分:0)

这不会导致保留周期。它是对象的单向引用,其中父视图在辅助(自定义)视图中具有引用。但是,父视图中没有该辅助视图的引用。因此,除非出现这种情况,否则就保留周期而言,您是非常安全的,并且不需要父视图的弱引用。