Objective-C中的实例变量默认设置为nil吗?

39

我正在解决我的iPhone应用程序的一些内存问题,我刚刚在思考一些基础知识。如果我设置了一个ivar并且在对象的生命周期中从未使用过它,当我调用dealloc时,会出现问题吗?例如:

@interface testClass {
    id myobject;
}
@property (nonatomic, retain) id myobject;
@end

@implementation testClass
@synthesize myobject;
- (id)init {
    ...
    // Do I have to set myobject to nil here?
    // So if myobject isn't used the dealloc call to nil
    // will be okay? Or can you release the variable without
    // having set every object to nil that you may may not use 
    ...
}

...

// Somewhere in the code, myobject may be set to
// an instance of an object via self.myobject = [AnObject grabAnObject]
// but the object may be left alone

...

- (void)dealloc {
    [myobject release];
    [super dealloc];
}
@end

Mike Abdullah:我已经在我的编辑中进行了更改。 - Peter Hosey
啊,原来在函数中创建的普通变量在声明时不会被设置为0/nil?只有实例变量才会。那么普通变量是否只包含“垃圾”值,直到你明确地将其设置为某些值呢? - Michael Waterfall
@MichaelWaterfall 本地对象变量会自动初始化为nil。 - Christopher Martin
1
当你使用 ARC 时,这是必须的。 - gnasher729
3个回答

61

11

10
我不认为浪费、冗余的代码是好的实践。你会确保把所有的局部变量设置成相同的值,反复几次以使其明确吗? - Chuck
11
在代码中多次设置本地变量会降低其清晰度并增加混淆。显式设置实例变量可以提高代码的清晰度,而对 Objective-C 不太熟悉的新团队成员更容易理解正在发生的事情。提高代码清晰度比减少“浪费”的代码更重要。 - BJ Homer
2
Objective-C开发人员应该熟悉ivars的零初始化。由于零化,“init”方法通常可以完全省略,这是一件好事。如果开发人员仍在学习阶段,他们不应该从代码中学习这个概念,而应该从书籍、教师、SO或其他途径学习。无论如何,通过阅读冗余代码是无法学习到这个概念的。 - Nikolai Ruhe
2
这是错误的建议。没有任何理由将您的ivars设置为nil。 - retainCount
2
再多说一点废话,将它们设置为nil实际上会增加混淆,因为当一个有经验的Cocoa程序员看到那个时,他会自言自语,“现在,为什么要把它设为nil?也许是超类将其设置为某些东西,所以这个类的作者想要撤销那个...现在我必须去看看。” - Paul Bruneau
显示剩余3条评论

0

我发现在init方法中将那些实例变量设置为nil是一个好习惯。这样,你就可以确信在析构函数中调用release不会出问题。

如果事实证明Objective-C确实会自动将它们设置为nil,并且由于某种原因你发现通过删除这些赋值可以提高速度(这种情况非常罕见),那么你可以考虑删除它们。与此同时,将它们全部设置为nil,睡得更安心 :)

更新:BJ Homer和Chuck指出实例变量自动设置为零,所以现在这取决于风格的决定。


3
无论哪种方式,你都可以确定。只是一种方式,你的初始化方法充满了无用的赋值。 - Chuck
1
最好的代码是你不必写的代码。如果一种语言提供了保证,那就要利用它们。 如果你开始怀疑语言基础文档(比如ivars的nilling),那么你就陷入了一个真正的兔子洞。 - occulus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接