NSMutableArray,removeFromArray和release,为什么会崩溃?
问题描述:
以下方法用于在最后清理其空白页的日志。NSMutableArray,removeFromArray和release,为什么会崩溃?
// self.pages property declaratioN, this is on the header
@property(nonatomic, retain) NSMutableArray *pages;
// method that crashes
- (void)cleanup {
NSMutableArray *pagesToRemove = [[NSMutableArray alloc] init];
for (int n = [self.pages count]-1; n >= 0; n--) {
JournalPage *page = [self.pages objectAtIndex:n];
if (![page isEmpty]) {
break;
} else {
if (([self.pages count] - ([pagesToRemove count] + 1) > 2)) {
[pagesToRemove addObject:page];
} else {
break;
}
}
}
if ([pagesToRemove count] % 2 != 0) {
[pagesToRemove removeLastObject];
}
[self.pages removeObjectsInArray:pagesToRemove];
[pagesToRemove release]; // this line makes the app crash
}
释放pagesToRemove
导致崩溃。如果我删除[pageToRemove release]
,崩溃也会发生,并且在alloc/init NSMutableArray
实例时使用autorelease。
不释放pageToRemove
代码工作,但我看到了泄漏,并铛分析器也看到它。
此代码是否泄漏;如果不是,为什么?
答
有一个在你的不速之客一个错字:
[pageToRemove release]; // this line makes the app crash
注意,它说pageToRemove,而不是网页小号的文档,删除。 ;)
+0
你是对的,不幸的是这是我在这里重新设置了代码为*的错字;无论如何,崩溃都会发生。但是,谢谢,我现在正在编辑来修复这个错误 – nutsmuggler 2011-01-20 09:08:08
页面本身是否有可能被过度释放?所以基本上,一旦你从self.pages中删除它们,它们基本上被销毁,然后当pagesToRemove被释放时,它们会得到额外的释放信息并导致崩溃。这是我的猜测,完全基于这里介绍的内容。所以看看你是如何创建页面对象本身。 – 2011-01-20 08:44:05