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

Posted

技术标签:

【中文标题】Objective-C 中的实例变量是不是默认设置为 nil?【英文标题】:Are instance variables set to nil by default in Objective-C?Objective-C 中的实例变量是否默认设置为 nil? 【发布时间】:2010-12-19 16:43:11 【问题描述】:

我正在整理我的 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:我在编辑中做出了改变。 啊,对了,那么在函数中创建的普通变量在声明它们时没有设置为 0/nil 吗?只是实例变量。那么,在您明确将其设置为某个值之前,普通变量只包含“垃圾”是否正确? @MichaelWaterfall Local object variables are automatically initialized to nil. ...当您使用 ARC 时,您应该这样做。 【参考方案1】:

初始化程序运行之前的实例变量are initialized to 0..

【讨论】:

【参考方案2】:

是的,ivars are always initialized to 0/nil/NULL/NO/etc。

但是,如果它可以帮助您了解正在发生的事情,那就去做吧。性能影响可以忽略不计。你不需要这样做,但这样做不会造成任何问题。

【讨论】:

我看不出有多么浪费,冗余代码是一种很好的做法。您是否确保连续多次将所有局部变量设置为相同的值以使其真正明确? 没有。多次设置局部变量会降低代码的清晰度并增加混乱。显式设置 ivar 可以提高清晰度,并且团队中不太熟悉 objc 的新成员更容易理解正在发生的事情。代码清晰比减少“浪费”的代码更重要。 Objective-C 开发者应该熟悉 ivars 的零初始化。由于归零init 方法通常可以完全省略,这是一件好事。如果开发人员仍在学习,他们不应该从代码中学习这个概念,而是从书本、讲师、SO 或其他东西中学习。无论如何,他们不会通过阅读冗余代码来学习这个概念。 这是个坏建议。绝对没有理由将您的 ivars 设置为 nil。 再打一匹死马,将它们设置为 nil 实际上会增加混乱,因为当一个知识渊博的 Cocoa 程序员看到这一点时,他会自言自语:“现在,为什么将其设置为 nil ? 也许超类设置了一些东西,所以这个类的作者想要撤消它......现在我必须去看看“【参考方案3】:

我发现在 init 方法中始终将这些 ivars 设置为 nil 是一种很好的做法。这样,您绝对可以确定在析构函数中调用 release 不会导致问题。

如果事实证明 Objective-C 确实自动将它们设置为 nil,并且由于某种原因您发现自己遇到了可以通过删除这些分配来改善的速度瓶颈(极不可能),那么您可以担心删除它们。同时,将它们全部设置为nil 并更容易入睡:)

更新: BJ Homer 和 Chuck 指出 ivars 自动设置为零,所以现在归结为风格决定。

【讨论】:

无论哪种方式,您都可以确定。你的 init 方法充满了无用的分配,这只是一种方式。 最好的代码是你不必编写的代码。如果一种语言做出保证,请利用它们。如果您开始怀疑该语言基础知识的文档(例如 nilling ivars),那么您就进入了一个真正的兔子洞。

以上是关于Objective-C 中的实例变量是不是默认设置为 nil?的主要内容,如果未能解决你的问题,请参考以下文章

知识梳理Objective-C中的@property

Objective-C中的setter和getter使用

Objective-C 中的 int 是不是有默认值 1?

Objective-C 中的属性和实例变量

Objective-C 中的 switch 语句和实例变量分配

Objective-C中的@Property具体解释