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

时间:2009-11-23 23:25:14

标签: iphone objective-c cocoa cocoa-touch memory-management

我正在使用我的iPhone应用程序解决一些内存问题,而我一直在考虑一些基础知识。如果我设置了一个ivar并且永远不会在我的对象的生命周期中使用它,当我在其上调用dealloc时,会导致问题吗? E.g。

@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

3 个答案:

答案 0 :(得分:56)

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

答案 1 :(得分:11)

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

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

答案 2 :(得分:0)

我发现在nil方法中始终将这些ivars设置为init是一种好习惯。这样,您完全确定在析构函数中调用release不会导致问题。

如果事实证明Objective-C确实自动将它们设置为nil,并且由于某种原因你发现自己有一个速度瓶颈,可以通过删除这些分配(极不可能)来改进,那么你可以担心删除它们。在此期间,将它们全部设置为nil并让您更轻松地睡觉:)

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