2011-01-20 176 views
0

以下方法用於在最後清理其空白頁的日誌。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

回答

0

有一個在你的不速之客一個錯字:

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

注意,它說pageToRemove,而不是網頁小號的文檔,刪除。 ;)

+0

你是對的,不幸的是這是我在這裏重新設置了代碼爲stackoverflow的錯字;無論如何,崩潰都會發生。但是,謝謝,我現在正在編輯來修復這個錯誤 – nutsmuggler 2011-01-20 09:08:08