繁体   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