我正在使用我的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
答案 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 将自动设置为零,所以现在归结为关于风格的决定。