我的自定义UIViewController中的成员变量被定义为'assign'(不是'retain'),如下所示:
@property (nonatomic, assign) UIButton* mSkipButton;
在我的loadView方法中,我将var(例如self.mSkipButton)设置为自动释放的变量类型的alloc。然后我将它附加到我的控制器视图,基本上具有视图引用计数并根据需要释放它。
然而,这让我感到担心的是,我将指针存储在我的成员var中,并且如果计数在某个时刻递减,它可以引用释放的内存。更好的做法是将变量声明为'retain',然后在viewDidUnload方法中释放成员var(或者将其设置为nil以释放并确保我没有地址)?
或者,我可以在viewDidUnload中将成员var设置为nil而不是将其保留为保留变量吗?
答案 0 :(得分:2)
这是一个属性,而不是“成员var”(在Objective-C中称为实例变量或 ivar 。)
属性的语义取决于该属性的使用方式。一般来说,您希望在对象的生命周期内保留属性。如果属性是连接的IBOutlet
,则由NIB加载器为您完成;否则,您必须明确并使用该属性上的retain
或copy
属性。
对于预期拥有对象的对象,应始终将属性标记为assign
以避免保留循环。例如,一个对象通常拥有它作为委托的任何对象(通常,但并不总是 - 每个CS规则都有一个例外。)
答案 1 :(得分:2)
更好的做法是将变量声明为'retain',然后在viewDidUnload中声明......?
是的,使用retain
- 良好的直觉。在viewDidUnload
中,您通常只需通过ivar的设置器将其设置为nil
:self.ivar = nil;
我发现明确地更清楚地了解和管理对象代码,而不是处理与使用assign
相关的问题。您可以完全避免持有非托管引用的问题。
可以证明assign
通常在这里很好(并且在某些情况下是这样),但使用assign
可能会使使用该类的任何人的对象图和所有权复杂化。随着程序复杂性的增加(以及您依赖的库发生变化),跟踪非托管引用的生命周期变得越来越困难。在不同的硬件和软件组合上,事情往往会中断或运行方式不同。尝试在复杂程序或并发上下文中管理非托管对象的生命周期是自我滥用。保证定义和可预测的行为/操作可以减少错误计数。