web-dev-qa-db-ja.com

[NSMutableArray array]と[[NSMutableArray alloc] init]の違い

誰かが可変配列の宣言の違いを教えてくれますか?

NSMutableArray *array = [NSMutableArray array];

そして

NSMutableArray *array = [[NSMutableArray alloc] init];

当初はすべての配列をallocで宣言していましたが、特定の関数の最後にallocで作成した配列を返すと、メモリリークの問題のためにその配列を自動解放する必要があったためです。

最初の宣言を使用して、何もリリースする必要はありません。

ありがとう

55
Adelino

当初、私はすべての配列をallocで宣言し、特定の関数の最後にallocで作成された配列を返した場合、メモリリークの問題のため、その配列を自動解放する必要があったためです。最初の宣言を使用して、何も解放する必要はありません

オブジェクトを「ベンダー」するとき、それは正確に正しいです。しかし、iOSでオブジェクトを作成するときに、既製の自動解放オブジェクトを取得するか、allocを呼び出してからreleaseを呼び出すかを選択できる場合、Appleはallocとreleaseの使用を希望します、これによりオブジェクトの有効期間が短くなり、管理下に置かれるためです。

ここでの問題は、自動解放されたオブジェクトが自動解放プールに存在し、プールが空になるまで、いつでもそれが蓄積される可能性があることです。

もう1つ注意すべき点は、ループです。あなたはそれを意識せずに自動解放されたオブジェクトを生成するかもしれません、そしてそれらはプールにただ山積みになります。解決策は、ループの開始時に独自の自動解放プールを作成し、ループの終わりに解放して、ループを通じてオブジェクトが解放されるようにすることです。

EDIT-12/18/2011:しかし、iOS 5とARCの登場により、自動解放メカニズムははるかに効率的であり、releaseのようなものはありません。 alloc-initと自動解放されたオブジェクトを販売するコンビニエンスコンストラクターの間では、意味がありません。 (また、現在は@autoreleasepool自動解放プール(擬似)オブジェクトではなくブロック。)

31
matt

array クラスメソッド自体が自動解放された配列を生成します。つまり、手動で解放する必要はありません(すべきではありません)。

37
BoltClock