次のメソッドは、最後の空のページのジャーナルをクリーンアップするために使用されます。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アナライザも見ています。
このコードは漏れていますか?そうでない場合、なぜですか?
ページ自体がどこかでリリースされている可能性はありますか?つまり、基本的にself.pagesからそれらを削除すると、それらは本質的に破壊され、次にpagesToRemoveが解放されると、余分な解放メッセージが得られ、クラッシュを引き起こします。それはここに提示されているものにのみ基づいて私の推測だろう。ページオブジェクト自体をどのように作成しているのかを見てみましょう。 –