1

我的自定义 UIViewController 中有成员变量,它们被定义为“分配”(不是“保留”),如下所示:

@property (nonatomic, assign) UIButton* mSkipButton;

在我的 loadView 方法中,我将 var(例如 self.mSkipButton)设置为变量类型的自动释放 alloc。然后我将它附加到我的控制器的视图中,基本上具有视图引用计数并根据需要释放它。

然而,这让我担心,我将指针存储在我的成员 var 中,并且如果计数在某个时候减少,它可能会引用已释放的内存。将变量声明为“retain”然后在 viewDidUnload 方法中释放成员 var (或者将其设置为 nil 以释放并确保我没有地址)是更好的做法吗?

或者,我可以简单地在 viewDidUnload 中将成员 var 设置为 nil 并且不使其成为保留变量吗?

4

2 回答 2

2

这是一个属性,而不是“成员 var”(在 Objective-C 中称为实例变量或ivar。)

属性的语义取决于该属性将如何被使用。一般来说,您会希望在对象的整个生命周期内保留您的属性。如果属性是 connected IBOutlet,这将由 NIB 加载器为您完成;否则,您必须明确并在属性上使用retainorcopy属性。

对于预期拥有您的对象的对象,应始终标记属性assign以避免保留循环。例如,一个对象通常拥有它作为委托的任何对象(通常,但不总是——每个 CS 规则都有一个例外。)

于 2012-01-05T21:32:48.797 回答
2

将变量声明为“retain”然后在 viewDidUnload ... 中是更好的做法吗?

是的,使用retain——良好的直觉。在viewDidUnload中,您通常只需nil通过 ivar 的设置器将其设置为:self.ivar = nil;

我发现明确地了解和管理对象依赖关系比处理与使用assign. 您可以完全避免持有非托管引用的问题。

可以提出assign通常在这里很好的参数(在某些情况下是这样),但是assign对于使用该类的任何人来说,使用会使对象图和所有权变得复杂。随着程序复杂性的增加(以及您所依赖的库的变化),跟踪非托管引用的生命周期变得越来越困难。在不同的硬件和软件组合上,事情往往会发生故障或以不同的方式运行。试图在复杂程序或并发上下文中管理非托管对象的生命周期是自滥用。保证已定义且可预测的行为/操作可减少错误数量。

于 2012-01-05T22:12:40.733 回答