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?

如何使用 NSPredicate 从另一个 NSMutableArray 中过滤 NSMutableArray

NSMutableArray基本概念