1

私の質問が StackOverflow で既に議論されていることは知っていますが、私のニーズに対して答えが完全ではないことがわかりました。質問は次のとおりです。

NSMutableArray *firstArray = [[NSMutableArray alloc] initWithObjects: obj1,obj2,nil];
NSMutableArray *secondArray = [[NSMutableArray alloc] init];
secondArray = [firstArray mutableCopy];

現在、secondArray の保持カウントは何ですか? 2または1?2回リリースする必要がありますか、それとも1回だけリリースする必要がありますか? copy または mutableCopy は、COPYING (このイベントでは secondArray) オブジェクトの保持数を増やしますか?

4

2 に答える 2

5

絶対保持カウントを気にする必要はありません。「バランスが取れている」ということだけです。つまりalloc、 、new*copymutableCopyおよび対応するorretainが必要です(ARC を使用しない場合)。releaseautorelease

このルールを各行に適用すると、2 行目には がありますがalloc、リリースがないことがわかります。実際、ここにインスタンスを割り当ててもまったく意味がありません。とにかく関心がないからです。したがって、次のように単純に読む必要があります。

NSMutableArray *firstArray = [[NSMutableArray alloc] initWithObjects: obj1,obj2,nil];
NSMutableArray *secondArray = [firstArray mutableCopy];
// There is no third line.

しかし、元のコードについて議論し、何が起こったのか見てみましょう:

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.

Objective-C では、所有権についてよく話します。オブジェクトの「所有者」になる方法はほとんどありません。これらは:

  • alloc
  • new*、のようにnewFoo
  • copymutableCopy
  • retain

これらを呼び出すと、自分が担当するオブジェクトが取得されます。つまり、これらのオブジェクトで対応する数のreleaseand/orを呼び出す必要があります。autoreleaseたとえば、次のようにすれば問題ありません[[obj retain] retain];[[obj autorelease] release];

于 2011-11-08T11:07:00.583 に答える
1
NSMutableArray *firstArray = [[NSMutableArray alloc] initWithObjects: obj1,obj2,nil];
NSMutableArray *secondArray = [[NSMutableArray alloc] init];
secondArray = [firstArray mutableCopy];

何が起こっているかというと、メモリ リークが発生したということです。この行で firstArray の mutableCopy で上書きしたときに、secondArray に割り当てられた参照が失われました。

secondArray = [firstArray mutableCopy];

次に secondArray を 2 回解放すると、プログラムがクラッシュします。

secondArray = [firstArray mutableCopy];

あなたがする必要があるのは、誤って保持された参照を上書きしていないことを確認し、リリースとのバランスを保つことです。

于 2011-11-08T11:20:31.943 に答える