Iphone 在Objective-C中,实例变量是否默认设置为零?

Iphone 在Objective-C中,实例变量是否默认设置为零?,iphone,objective-c,cocoa,cocoa-touch,memory-management,Iphone,Objective C,Cocoa,Cocoa Touch,Memory Management,我正在用我的iPhone应用程序解决一些内存问题,我只是在考虑一些基本问题。如果我设置了一个ivar并且在我的对象的生命周期内从未使用过它,当我调用它的dealloc时,这会导致问题吗?例如 @interface testClass { id myobject; } @property (nonatomic, retain) id myobject; @end @implementation testClass @synthesize myobject; - (id)init {

我正在用我的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

我发现在
init
方法中总是将那些ivar设置为
nil
是一种很好的做法。这样,您就完全可以确定在析构函数中调用
release
不会导致问题

如果事实证明Objective-C确实会自动将它们设置为
nil
,并且由于某种原因,您发现自己存在一个速度瓶颈,可以通过删除这些任务来加以改进(可能性很小),那么您可以担心删除它们。同时,将它们全部设置为
nil
并使睡眠更轻松:)

更新:BJ Homer和Chuck指出ivars将自动设置为零,因此现在取决于风格。

是的


然而,如果这有助于你理解发生了什么,那就去做吧。性能影响可以忽略不计。您不需要这样做,但如果这样做,将不会导致任何问题。

在初始值设定项运行之前执行实例变量。

我不认为浪费、冗余的代码是多么好的做法。您是否确保连续多次将所有局部变量设置为相同的值以使其真正明确?否。多次设置局部变量会降低代码的清晰度并增加混乱。明确设置ivar可以提高清晰度,团队中不太熟悉objc的新成员更容易理解发生了什么。代码清晰比减少“浪费”代码更重要。Objective-C开发人员应该熟悉IVAR的零初始化。由于归零
init
方法通常可以完全省略,这是一件好事。如果开发人员仍在学习,他们不应该从代码中学习这个概念,而应该从书籍、讲师或其他什么地方学习。无论如何,他们不会通过阅读冗余代码来学习这个概念。这是一个糟糕的建议。绝对没有理由把你的IVAR设置为零。再把一匹死马打败一点,把它们设置为零实际上会增加混乱,因为当一个有知识的可可程序员看到这一点时,他对自己说,“现在,为什么设置为零?也许超类将它设置为某个值,所以这个类的作者想要撤销它…现在我必须去看看“这两种方法你都可以肯定。只有一种方式,你的init方法充满了无用的赋值。最好的代码是你不必编写的代码。如果一种语言提供了保证,就要使用它们。如果你开始怀疑该语言的基础文档(比如ivars的nilling),那么你就陷入了一个真正的兔子洞。Mike Abdullah:我在编辑中做了这个更改。啊,对了,那么当你声明它们时,函数中创建的普通变量没有设置为0/nil?只是实例变量。那么,在您显式地将其设置为某个值之前,普通变量只包含“垃圾”是正确的吗?@MichaelWaterfall。。。当您使用ARC时,您应该这样做。