判断对象是否在Objective-C中分配的正确方法是什么?
我在示例代码中看到过(这似乎只有在从未分配过时才有效):
if(!Object){...}
我也尝试过设置Object = nil,但每次都是一个繁琐的过程,有点烦人。
但如果我有一个对象,并且我想多次分配和释放它,那么正确的方法是什么?谢谢!
答案 0 :(得分:4)
除了简单地发送消息并查看是否崩溃之外,无法判断变量是否指向有效对象。对象变量只是指针。要告诉的唯一方法是使用标记值(例如nil
)。但这通常不应成为问题。如果这给您带来麻烦,那就是您的应用程序设计存在缺陷的证据。没有理由让可能被初始化或可能没有的变量挂起。
答案 1 :(得分:4)
如果您没有立即为对象变量赋值,则始终将对象变量初始化为nil。当您尝试访问未初始化的对象时,实际上不会这样做会导致崩溃。
然后你确实可以做到
if(!object)
{
//some stuff
}
因为nil对象保证返回负布尔结果,并且任何非nil的对象都将返回正结果。
答案 2 :(得分:0)
另一种选择是研究NSZombie。它可以帮助您识别僵尸(引用已经解除分配的内存位置的指针(并可能重新分配给其他内容!)),但您不希望它出现在生产代码中。
根据您的情况的复杂程度,您需要在释放后立即将变量设置为nil,或者您需要创建另一个变量来自己跟踪引用。但所有这一切只是在惹麻烦。
如果你真的被卡住了,并且对象变量被一些在你完成对象之后才会被释放的东西引用,那么只需将对象放在自动释放池中并完成它。
答案 3 :(得分:0)
目前使用属性的最佳做法是将setter方法发送为nil。因此@property (nonatomic, retain) UIButton *startButton;
之类的内容与self.startButton = nil;
相关联。这仅适用于读写属性。对于只读属性或具有out setter的实例,您必须在释放后将它们设置为nil。