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代码工作,但我看到了泄漏,并铛分析器也看到它。
此代码是否泄漏;如果不是,为什么?

+1

页面本身是否有可能被过度释放?所以基本上,一旦你从self.pages中删除它们,它们基本上被销毁,然后当pagesToRemove被释放时,它们会得到额外的释放信息并导致崩溃。这是我的猜测,完全基于这里介绍的内容。所以看看你是如何创建页面对象本身。 – 2011-01-20 08:44:05

有一个在你的不速之客一个错字:

[pageToRemove release]; // this line makes the app crash 

注意,它说pageToRemove,而不是网页小号的文档,删除。 ;)

+0

你是对的,不幸的是这是我在这里重新设置了代码为*的错字;无论如何,崩溃都会发生。但是,谢谢,我现在正在编辑来修复这个错误 – nutsmuggler 2011-01-20 09:08:08