ARC 会在啥条件下保留该对象?

Posted

技术标签:

【中文标题】ARC 会在啥条件下保留该对象?【英文标题】:Under what conditions will this object be retained by ARC?ARC 会在什么条件下保留该对象? 【发布时间】:2013-12-25 13:46:13 【问题描述】:

例如,如果我有几个这样连接的 IBOutlets:

@property (nonatomic, strong) IBOutlet NSTextField * textField; 
@property (nonatomic, strong) IBOutlet NSTextField * anotherOne;  
@property (nonatomic, strong) IBOutlet NSButton * button; 
/* And so on...*/

然后我将在 IB 中创建一个父视图并将其与父视图连接(也声明为强实例变量):

@property (nonatomic, strong) IBOutlet NSView * customView; 

我的问题是:如果我要这样做,ARC 是否会保留此自定义视图及其所有子视图:

NSArray * subviews = [customView subviews];
for (NSView * view in [subviews copy]) 
     [view removeFromSuperview]; /* Is view being retained? */

我相信将其设置为强属性会导致它被保留。 Apple 的文档说,如果您以后可能需要它们,您应该保留您调用 removeFromSuperview 的任何视图。如果在调用 removeFromSuperview 的过程中视图没有被保留,有人可以告诉我如何保留它吗?

谢谢。

更新:我最近了解到调用 addObject:someObj 会增加 someObj 的保留计数。因此,将其添加到数组将导致它被保留。将其添加到可变数组以增加保留计数是否存在任何泄漏,或者 ARC 会为我处理这些问题吗?

【问题讨论】:

请详细说明这与osx 有什么关系。这与osx 无关,因此请不要再次使用该标签重新标记。 【参考方案1】:

我不会在您的示例中看到泄漏。 您不需要为在 IB 中创建的对象定义强属性,因为 IB 会自动保留它们。但是,在使用 ARC 时,这应该不会产生影响,因为无论如何运行时都会为您清理。

如果我想保留视图元素,我也会将它们保存在数组中。 所以 NSMutableArray 会是你的朋友。

【讨论】:

所以我可以遍历子视图并将每个子视图添加到可变数组中?这会留住他们吗? 是的。这将起作用。正如您自己编写的那样,将对象添加到数组、集合、列表......会增加保留计数。

以上是关于ARC 会在啥条件下保留该对象?的主要内容,如果未能解决你的问题,请参考以下文章

CCmdTarget::OnFinalRelease 在啥条件下被调用?

使用 ARC 查找对象的保留位置

在啥条件下创建 JSESSIONID?

for 循环中的强类对象未保留在 ARC 中

在啥情况下,我想创建从 Linq 到 Sql 结果的自定义业务对象?

iOS 内存管理