0

静的アナライザーによると、次のプロパティがある場合:

@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リリースをコメントアウトすると、すべて問題ありません。

4

4 に答える 4

4

あなたが言及する自動解放方法は、他の一般的なイディオムと同様に問題ありません。

SomeObject *thing = [[SomeObject alloc] init];
self.object = thing;
[thing release];

後で過剰リリースすることになった場合、それが問題です。あなたが明らかに正しくやっているこの部分は、問題ではありません。

于 2012-06-05T15:45:39.180 に答える
1
SomeObject * new_object = [SomeObject alloc] init];
self.object = new_object;
[new_object  release];

またはARCを使用する

于 2012-06-05T15:45:36.667 に答える
0

文字列のプロパティが割り当てられている(そして保持するように変更されている)かどうか、GeographyPickerItemを確認するか、(リリース前に)常に初期化するかどうかを確認します。

手動で割り当てることの違いも覚えておいてください:

[[NSString alloc] initWith...]

リリースまたは自動リリースする必要があります。

[NSString stringWith...] 

リリースする必要はありません。

またはメガーが言ったようにARCを使用する

于 2012-06-06T22:31:30.730 に答える
0

問題は単純であることがわかりました。私のdeallocメソッドは、メソッドの最後ではなく最初にスーパーdeallocと呼ばれていました。[superdealloc]を呼び出す前に常にインスタンス変数を解放する必要があります。

于 2012-06-08T00:16:44.323 に答える