静的アナライザーによると、次のプロパティがある場合:
@property (retain, nonatomic) SomeObject * object;
次に、次のようにプロパティを割り当てます。
self.object = [SomeObject alloc] init];
リークが発生します。alloc initが保持カウントに+1を追加し、次に保持プロパティも保持カウントをインクリメントするため、これは理にかなっています。ここでの最良の解決策は何ですか?通常、次のように自動リリースを追加します。
self.object = [[SomeObject alloc] init] autorelease];
しかし、これによって問題が発生することがあり、オブジェクトを解放しすぎてアプリがクラッシュすることがあります。現在、具体的な例はありませんが、アプリケーションがクラッシュする原因となる自動リリースをいくつか削除する必要があったことを覚えています。ここに欠けているものはありますか?
編集:私は今、私が遭遇した問題の具体的な例を持っています。
NSMutableArray *newData = [NSMutableArray array];
//If this is true then we are showing all of the items in that level of hierarchy and do not need to show the summary button.
if (!(contextID.count >= 1 && [[contextID objectAtIndex:contextID.count - 1] isEqual:[NSNull null]]) && contextID.count != 0)
{
GeographyPickerItem * firstItem = [[GeographyPickerItem alloc] init];
firstItem.primaryString = [NSString stringWithString:@"Summary"];
firstItem.subString = [NSString stringWithString:@""];
firstItem.isSummaryItem = YES;
[newData addObject:firstItem];
[firstItem release]; //TODO: Figure out why this is causing EXC_BAD_ACCESS errors
}
self.hierData = newData;
上記のコードは、ビューコントローラのinitメソッドに含まれています。HierDataは保持されたプロパティであり、viewControllersのdeallocメソッドで解放されます。GeographyPickerItemは、primaryStringとsubStringの2つの文字列を保持し、独自のdeallocメソッドでそれらを解放します。ナビゲーションコントローラーのポップオフに続いてviewControllersの割り当てが解除されると、アプリケーションがクラッシュすることがあります。GeographyPickerItemのdeallocメソッド([substringrelease]または[primaryStringrelease]のいずれか)でEXC_BAD_ACCESSシグナルを使用してクラッシュします。
適切なメモリ管理ガイドラインに従っていると思うので、なぜこれが起こっているのかわかりません。firstItemリリースをコメントアウトすると、すべて問題ありません。