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

Mic*_*all 38 iphone cocoa cocoa-touch memory-management objective-c

我正在用我的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
Run Code Online (Sandbox Code Playgroud)

Chu*_*uck 56

在初始化程序运行之前,实例变量初始化为0.


BJ *_*mer 11

是的,ivars总是被初始化为0/nil/NULL/NO /等.

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

  • 否.多次设置局部变量会降低代码的清晰度并增加混淆.明确设置ivar可以提高清晰度,不熟悉objc的团队中的新成员更容易理解正在发生的事情.代码清晰度比减少"浪费"代码更重要. (11认同)
  • 我没有看到多么浪费,多余的代码是好的做法.您是否确保将所有局部变量连续多次设置为相同的值才能使其真正明确? (10认同)
  • Objective-C开发人员应该熟悉ivars的零初始化.由于归零`init`方法通常可以完全省略,这是一件好事.如果开发人员还在学习,他们不应该从代码中学习这个概念,而应该从书本,讲师,SO或其他任何东西中学习.无论如何,他们不会通过读取冗余代码来学习这个概念. (2认同)
  • 这是一个糟糕的建议.绝对没有理由将你的ivars设置为零. (2认同)
  • 为了击败死马,将它们设置为零实际上会增加混乱,因为当一个知识渊博的Cocoa程序员看到这一点时,他对自己说,"现在,为什么这被设置为零?也许超级类别将它设置为某种东西,所以本课程的作者想要撤消......现在我得去看看" (2认同)