2009-09-09 77 views
1

在Objective-C中分配对象的正确方法是什么?分配了Objective-C对象

我见过的示例代码(这似乎如果它没有被分配到唯一的工作):

如果(对象!){...}

我也尝试设置对象=零,但这是一个乏味的过程,每次都会让人感到有点烦。

但是,如果我有一个对象,我想多次分配和释放它,那么正确的方法是什么?谢谢!

回答

4

除了简单地发送消息并查看是否崩溃之外,无法判断变量是否指向有效的对象。对象变量只是指针。要告诉的唯一方法是使用标记值(例如nil)。但这通常不是问题。如果这给你带来麻烦,那就证明你的应用程序设计存在缺陷。没有理由让变量挂起来,可能会被初始化或不可能。

+0

您可以声明不指向事物的变量,但不应该存在不知道是否指向某些事物的情况。你可以声明一个指针而不是设置它,稍后再做,但你应该知道它的设置+! :D – 2009-09-09 01:02:24

4

你应该总是初始化对象变量为零,如果你不立即分配给他们一个值。如果不这样做,几乎可以确保在尝试访问未初始化的对象时某个时候会导致崩溃。

然后,你可以做确实

if(!object) 
{ 
    //some stuff 
} 

因为nil对象是保证返回一个负布尔结果,而不是零任何对象将返回一个积极的结果。

+2

静态,全局和实例变量始终初始化为零;重新初始化它们将是多余的。 (在发布内容之后将它们设置为零,但是,必须的(当然在dealloc中除外)) – rpetrich 2009-09-09 05:13:17

+0

@rpetrich请问官方文档或其他资料来源说,Static,global并且实例变量总是被初始化为nil'。我以前没有听说过。提前致谢。 – MainstreamDeveloper00 2013-07-28 17:46:04

+1

@HarryCater查看Apple的对象分配文档(http://developer.apple。com/library/ios/#documentation/general/conceptual/CocoaEncyclopedia/ObjectAllocation/ObjectAllocation.html#// apple_ref/doc/uid/TP40010810-CH7-SW1)和静态/全局初始化文档的C标准 – rpetrich 2013-07-29 07:57:34

0

另一种选择是调查NSZombie。它可以帮助你识别僵尸(引用已经释放的内存位置的指针(并可能重新分配给别的东西!)),但你不希望它在生产代码中使用。

根据您的情况的复杂程度,您需要在释放变量后将其设置为零,或者您需要创建另一个变量来跟踪引用。但所有这些只是在惹麻烦。

如果你真的陷入困境,并且对象变量被某些东西引用,而这些东西只有在完成对象后才会释放,那么只需将对象放入autorelease池并完成它即可。

0

具有属性的当前最佳做法是发送setter方法nil。所以像@property (nonatomic, retain) UIButton *startButton;这样的东西就是self.startButton = nil;这只适用于读写属性。如果只读属性或带有超出setter的实例,则必须在释放它们之后将它们设置为零。