【发布时间】:2011-05-12 08:56:04
【问题描述】:
当我们为类变量分配内存时,我们应该释放它还是在dealloc方法中将它设置为nil?最佳做法是什么?
【问题讨论】:
-
你能解释一下“类变量”是什么意思吗?
标签: iphone objective-c cocoa-touch
当我们为类变量分配内存时,我们应该释放它还是在dealloc方法中将它设置为nil?最佳做法是什么?
【问题讨论】:
标签: iphone objective-c cocoa-touch
最佳实践:
[foo release]; // ensures that memory is released
foo = nil; // ensures that there is no dangling pointer to released memory
其他说明:
当您分配给声明为保留的属性时,
// in your .h
@property (retain) MyObject *foo;
// in your .m
self.foo = bar; // bar is retained; whatever foo previously pointed at is released
它会释放它之前指向的东西并保留被分配的新对象。
所以,你可以使用:
self.foo = nil;
它会释放 foo 指向的任何东西。 但是,如果您的属性没有声明为保留存储语义,这不会隐式释放 foo 指向的任何内容。此外,正如 Ryan 指出的那样,可以覆盖属性以产生副作用。因此,最好遵循始终使用的模式:
[foo release];
为确保您没有指向已释放内存的悬空指针,您可以执行以下操作:
foo = nil;
如果您不使用具有保留语义的属性,您需要释放存储在变量中的任何内容:
[foo release];
编辑:另请参阅以下对另一个问题的回答:
【讨论】:
nil 可以掩盖错误。如果有人在之后访问 ivar,这是一个错误,并且分配 nil 都可以让这成功而没有任何明显的错误,并阻止使用任何内存调试工具。