UIView 将如何发布?解释
Posted
技术标签:
【中文标题】UIView 将如何发布?解释【英文标题】:How the UIView will get release? Explain 【发布时间】:2017-05-03 09:59:35 【问题描述】:在 ARC 中,我想释放添加到父视图和数组的自定义视图。
@property (nonatomic, weak) IBOutlet UIScrollView* panelScroll;
@property (nonatomic, retain) NSMutableArray *medsSectionViews;
以上是添加自定义视图对象的两个属性,如下所示:
CustomView* newView;
newView = [[CustomView alloc] init];
[panelScroll addSubview:newView];
[self.medsSectionViews addObject:newView];
newView = nil;
它没有释放对象。问题是什么?我怎样才能实现它?请在需要的地方提及参考计数。
【问题讨论】:
newView 没有被释放,因为 -addSubview: 并且数组保留了它。 视图由两个对象拥有。在这两个对象(数组和超级视图)停止使用它之前,它不能被释放。顺便说一句,你的代码不应该使用retain
。它应该使用strong
。
【参考方案1】:
CustomView *newView = [[CustomView alloc] init]; // 1 owner (the newView local variable)
[panelScroll addSubview:newView]; // 2 owners (local variable, the superview panelScroll)
[self.medsSectionViews addObject:newView]; // 3 owners (local variable, superview, array medsSectionViews)
newView = nil; // 2 owners (superview, array)
现在
[array removeAllObjects]; // 1 owner (superview)
[newView removeFromSuperview]; // 0 owners
// view gets deallocated because it has no owners
【讨论】:
【参考方案2】:有些方法会保留对象:
在您的代码中: 1.添加子视图: 2.添加对象:
保持你的观点;
所以你只需要: [数组删除所有对象]; [newView removeFromSuperview];
为什么 newView = nil 不能释放视图? 因为在 ARC 中,它使用引用计数来管理对象生命周期。
【讨论】:
【参考方案3】:您的 newView 变量似乎是一个局部变量。一旦超出范围,它将发布对您的观点的强烈参考。因此,您实际上不必将其设置为 nil。
您还有另外 2 个强引用:
-
数组保持对其内容的强引用。
当您将视图添加到超级视图时,超级视图拥有强引用。
如果你想释放它,你需要将它从数组中删除,并从它的超级视图中删除。请注意,它将被释放。
【讨论】:
以上是关于UIView 将如何发布?解释的主要内容,如果未能解决你的问题,请参考以下文章
iOS Instrumentation:如何解释内存分配模板?
在某些 VC 与其他 VC 中,如何将横幅 UIView 显示为 UINavigationController 的一部分