【发布时间】:2010-05-23 04:13:23
【问题描述】:
mystring 是否过度释放?
-(void)dealloc {
[mystring release];
[mystring release];
[super dealloc];
}
我认为这不会基于 [nil release] 什么都不做:
-(void)dealloc {
[mystring release];
mystring = nil;
[mystring release];
[super dealloc];
}
-编辑- 假设我在 init 中分配 mystring 并在 doSomething 中释放它:
-(id)init {
if (self = [super init]) {
mystring = [[NSString string] retain];
}
return self;
}
-(void)doSomething {
[mystring release]; // for some good reason
// ...etc
}
现在根据我上面的示例,为了避免在 dealloc 中过度释放,我是否必须在 doSomething 方法中显式执行此操作?
-(void)doSomething {
[mystring release];
mystring = nil; // <- is this mandatory to avoid over-releasing in dealloc?
}
最大的问题是当我在类的其他地方释放它以避免在 dealloc 中过度释放时,我是否必须明确地将它设置为 nil?
如果我在 doSomething 中明确设置为 nil,我是否可以在基于 dealloc 的情况下发布任意数量的版本?
-(void)dealloc {
[mystring release];
[mystring release]; // <- does nothing because mystring explicitly nil?
}
【问题讨论】:
-
取决于您通过复制或分配等方式增加了保留计数的次数。如果你从不以任何方式分配它,即使释放它一次也太多了。如果没有更多代码,您可能不会得到任何体面的答案
-
好吧,看起来确实有点主观。但是,我的主要观点是我想不惜一切代价避免过度释放。我将添加另一个代码示例,让大家更好地了解我在整个代码中所做的工作。
-
好的,基于我的第二个示例是正确的,我上面的附加代码示例如何适应过度发布?是否明确设置为零强制?
-
我问这个的原因是我可以避免在 dealloc 中这样做: if (mystring) [mystring release];将 if (variable) 放置在任何地方都会变得啰嗦。
标签: iphone objective-c cocoa-touch