1

こんにちは、クラスを初期化するためのこのコードがあります。

- (id)initWithSize:(int)size {

    self = [super init];

    if( self != nil )
    {
        [self setMyVector:[[NSMutableArray alloc] initWithCapacity:size]];

        for ( int i = 0; i < size; i++ ) 
        {
            [myVector addObject: [[NSMutableArray alloc] initWithCapacity:size]];
        }
    }

    return self;
}

私は Instruments でこのリークを取得しています !
カテゴリ: CFArray (store-deque)
イベント タイプ: Malloc

解決する必要があることを知っている人はいますか? ありがとう !

4

1 に答える 1

6

リークは for ループにあり、おそらくその前にもあります。

まず、この行:

[self setMyVector:[[NSMutableArray alloc] initWithCapacity:size]];

渡された配列を保持している場合setMyVector(慣例によれば、保持する必要があります)、配列をリークしています。まず、配列を割り当てて初期化します。保持カウントは +1 です。次に、それを myVector インスタンス変数に設定します。これは、保持カウントが +2 であることを意味します。myVector に何か他のものを入れるか、deallocメソッドで myVector 変数を解放すると、保持カウントが減少します。つまり、保持カウントが +1 になります。つまり、割り当てが解除されず、配列がリークされます。

もう 1 つの明確なリークは、for() ループ内にあります。

[myVector addObject: [[NSMutableArray alloc] initWithCapacity:size]];

ここでも、保持カウントが +1 の配列を作成し、それを myVector 配列に追加すると、再び保持 (+2) されます。ただし、配列へのポインターがなくなったため、リークしました。

これらのリークは両方とも[NSMutableArray arrayWithCapacity:size]、alloc/init アプローチの代わりに使用することで解決できます。これにより、自動解放された配列が作成され、メモリ リークが解決されます。

自動解放とは何かがわからない場合は、配列を作成してローカル変数に格納し、それを myVector に追加 (または myVector に設定) し、その後すぐに解放することを検討してください。

于 2009-09-06T20:51:31.050 に答える