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 将如何发布?解释的主要内容,如果未能解决你的问题,请参考以下文章

有人可以解释 UIView 的奇怪旋转吗?

将uiview分配或替换给其他uiview

iOS Instrumentation:如何解释内存分配模板?

请解释类方法

在某些 VC 与其他 VC 中,如何将横幅 UIView 显示为 UINavigationController 的一部分

UIView:layoutSubviews 与 initWithFrame