【发布时间】:2010-12-27 06:12:12
【问题描述】:
我在 main 中分配 myMDD,其中包含一个 NSMutableArray 实例变量(在 init 中分配/初始化)。当我将项目添加到 NSMutableArray (frameList) 时,我会在添加后释放。数组和它现在包含的对象在 main 的底部释放。
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
MDD *myMDD = [[MDD alloc] init];
Frame *myFrame = [[Frame alloc] init];
[myMDD addFrame:myFrame];
[myMDD release];
[pool drain];
return 0;
}
// METHOD_ mdd addFrame:
-(void)addFrame:(Frame*) inFrame {
[frameList addObject:inFrame];
[inFrame release];
}
// METHOD_ mdd dealloc
-(void)dealloc {
NSLog(@"_deal...: %@", self);
[frameList release];
[super dealloc];
}
我的问题是“静态分析器”报告了潜在的内存泄漏,更愿意将框架添加到 main 中。 (即)
int main (int argc, const char * argv[]) {
...
[myFrame release]; // Added
[myMDD release];
[pool drain];
return 0;
}
// METHOD_ mdd addFrame:
-(void)addFrame:(Frame*) inFrame {
[frameList addObject:inFrame];
// [inFrame release];
}
我知道为什么会这样,如果我分配 myMDD 并且从不调用 addFrame 那么我需要释放它。也许这只是将自动释放添加到 myMDD 的一种情况,但是在我调用 addFrame 并且 NSMutableArray 正在释放对象的情况下,这会起作用吗?
EDIT_001
改为...
int main (int argc, const char * argv[]) {
...
[myMDD addFrame:myFrame];
[myFrame release];
myFrame = nil;
[myMDD release];
[pool drain];
return 0;
}
// METHOD_ mdd addFrame:
-(void)addFrame:(Frame*) inFrame {
[frameList addObject:inFrame];
}
加里
【问题讨论】:
-
Re EDIT_001:你不需要
nil出一个变量,除非你用它来保存一个缓存(所以nil意味着“需要(重新)创建缓存”)。你几乎不需要nil出像myFrame这样的局部变量。 -
嗨彼得,myFrame 是一个指向对象的指针,没有 nil 是否不安全,因为我已经发布了它指向的内容?我的印象是 nil 指针更好,因为消息可以发送到 nil,但不能发送到不存在的对象?
-
这就是我们所说的
dealloc方法。如果您要向已解除锁定(或正在解除锁定)的对象的任何变量中的指针发送消息,那么您做错了。最好立即崩溃并找出该错误,而不是将消息发送到nil并因此隐藏错误。
标签: objective-c cocoa