NSMutableArray,removeFromArray 和 release,为啥会崩溃?
Posted
技术标签:
【中文标题】NSMutableArray,removeFromArray 和 release,为啥会崩溃?【英文标题】:NSMutableArray, removeFromArray and release, why does this crash?NSMutableArray,removeFromArray 和 release,为什么会崩溃? 【发布时间】:2011-01-20 08:36:05 【问题描述】:下面的方法用于清理日志的最后空页。
// 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]
并在我分配/初始化 NSMutableArray
实例时使用 autorelease,也会发生崩溃。
在不发布pageToRemove
的情况下,代码可以工作,但我看到了泄漏,并且clang 分析器也看到了。
这段代码是否泄漏?如果不是,为什么?
【问题讨论】:
页面本身是否有可能在某处被过度发布?所以基本上一旦你从 self.pages 中删除它们,它们基本上就被破坏了,然后当 pagesToRemove 被释放时,它们会得到额外的释放消息并导致崩溃。这将是我的猜测,仅基于此处介绍的内容。所以看看你是如何自己创建页面对象的。 【参考方案1】:你的崩溃中有一个错字:
[pageToRemove release]; // this line makes the app crash
请注意,它说的是 pageToRemove,而不是 pagesToRemove。 ;)
【讨论】:
你是对的,但不幸的是,这是我在这里重新设置***代码的错字;崩溃无论如何都会发生。但是谢谢,我现在正在编辑以修复错误以上是关于NSMutableArray,removeFromArray 和 release,为啥会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章
将自定义对象存储到 NSMutableArray,然后将此 NSMutableArray 存储到 NSUserDefaults
访问另一个 NSMutableArray 中的对象的 NSMutableArray(即嵌套对象访问)
在过滤另一个 NSMutableArray 的基础上过滤 NSMutableArray
从 NSData 的 NSMutableArray 转换为 NSString 的 NSMutableArray?