2011-01-20 4 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]を削除して、NSMutableArrayインスタンスを割り当て/初期化するときにautoreleaseを使用するとクラッシュすることもあります。

pageToRemoveがリリースされていないとコードは機能しますが、リークが見られ、clangアナライザも見ています。
このコードは漏れていますか?そうでない場合、なぜですか?

+1

ページ自体がどこかでリリースされている可能性はありますか?つまり、基本的にself.pagesからそれらを削除すると、それらは本質的に破壊され、次にpagesToRemoveが解放されると、余分な解放メッセージが得られ、クラッシュを引き起こします。それはここに提示されているものにのみ基づいて私の推測だろう。ページオブジェクト自体をどのように作成しているのかを見てみましょう。 –

答えて

0

あなたのクラッシャーにタイプミスがあります:それはpageToRemove、ないページ ToRemoveが言う

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

注こと。 ;)

+0

あなたは間違いなく、それは私がここではstackoverflowのコードを再インストラクションしたタイプミスです。クラッシュはとにかく起こります。しかし、ありがとう、私はバグを修正するために今編集中です – nutsmuggler

関連する問題