絶対的な保持回数には注意しないでください。あなたは(ARCを使用しない場合、つまり)あなたが対応するrelease
またはautorelease
を必要とするすべてのalloc
、new*
、copy
、mutableCopy
とretain
ための手段という、「バランス」だだけという。
このルールを各行に適用すると、2行目にalloc
が含まれていますが、リリースはありません。実際には、インスタンスをインスタンスに割り当てることは、あまり興味がないので絶対に無駄です。
NSMutableArray *firstArray = [[NSMutableArray alloc] initWithObjects: obj1,obj2,nil];
NSMutableArray *secondArray = [firstArray mutableCopy];
// There is no third line.
をしかしさんがあなたの元のコードを議論し、何が起こったのか見てみましょう:だから、単純に読んでください
のObjective-Cでは
NSMutableArray *firstArray = [[NSMutableArray alloc] initWithObjects: obj1,obj2,nil];
NSMutableArray *secondArray = [[NSMutableArray alloc] init];
// secondArray points to a new instance of type NSMutableArray
secondArray = [firstArray mutableCopy];
// You have copied another array (created a new NSMutableArray
// instance) and have overwritten the pointer to the old array.
// This means that the instance allocated in line 2 is still there
// (was not released) but you don't have a pointer to it any more.
// The array from line 2 has been leaked.
が、私たちはしばしば所有権の話:非常にいくつかの方法があることオブジェクトの「所有者」にします。これらは次のとおりである:
alloc
new*
、あなたがこれらを呼び出す場合newFoo
copy
とmutableCopy
retain
に、あなたは責任するオブジェクトを取得すると。つまり、対応する番号release
および/またはautorelease
をこれらのオブジェクトに呼び出す必要があることを意味します。あなたは何が起こっている[[obj retain] retain];
、その後[[obj autorelease] release];
私はあなたが所有し、ある段階で解放される必要がある2つのオブジェクトがあると付け加えたいと思います。そして、あなたは正しいのです - 「retainCount」は単なるものです - 所有呼と解放呼の解放のバランスについて心配してください。 – Abizern
実際には、secondArrayはコード内で遠く離れて割り当てられ、使用されています。私は便宜のために2行目に書きました。だから、メモリリークを避けるために私があなたを得たのであれば、まずsecondArrayを解放しなければなりません。これは絶対に有効でしょうか? –
@AndreyChernukha:終了したら、 'secondArray'が指すオブジェクトだけを解放します。 'release'は次のことを意味します:*この行から、私はもうオブジェクトを必要としません。 * 'autorelease'は次のことを意味します:*すぐに、私はもうそれを必要としません。しかし、私はこの方法を離れるまで少なくとも生きていなければなりません。*(それは100%正確ではありませんが、有用であるためには真実に十分近い) – DarkDust