我在我的班级'ClassA'中合成并声明了这个属性
@interface ClassA
@property (nonatomic, retain) NameFieldCell* nameCell;
@end
我知道规则说当使用retain | copy | ...声明nameCell属性时,应该在我的dealloc方法中释放它。
然而,'ClassA'被懒惰地实例化,有时甚至没有使用nameCell属性,这意味着我不使用它的setter方法也不访问它也不显式保留它。
我还应该在dealloc方法中调用[nameCell release]吗?我发现很难理解我应该发布一些甚至没有初始化的东西。并且由于它没有初始化,引用计数器为0并且没有意义释放它?或者,即使我没有使用它,在实例化“ClassA”时,nameCell会以某种方式自动保留吗?
答案 0 :(得分:3)
如果nameCell
为零,则[nameCell release]
无效。这样可以很容易地覆盖这两种情况,所以是的,你应该在你的dealloc方法中释放它。
那或开始使用ARC,你不必担心它。
答案 1 :(得分:3)
在Objective-C中,alloc
为类分配的内存在分配时初始化为all-bits-zero(然后设置isa
ivar),这导致{{1默认情况下,支持ivar设置为nameCell
。由于在Objective-C中向nil
发送消息并不是错误(该消息只是被忽略),因此您可以随时致电nil
,而无需担心[nameCell release]
是否为nameCell
永远不会。