0

私はiPhone / Macスペースに不慣れで、これはおそらくかなり基本的な質問です。いくつかの検索を行いましたが、直接的な答えは見つかりませんでした.

追加時に配列/可変配列の addObject メソッドが浅い (ポインターのみ) または深い (オブジェクトのコピー) を行うかどうかを知りたいです。

  1. 割り当てられた可変配列
  2. ある種のinitで割り当てられたNSString
  3. 可変配列に文字列を addObject します
  4. 次に、NSString を解放します

これが適切な方法である場合、addObject が NSString のディープ コピーを行うと想定されます。これが可変配列でメモリ管理を行う適切な方法であることを確認するだけです...

4

2 に答える 2

2

addObject:浅いコピーを行います。不足しているNSMutableArrayのは、オブジェクトを保持しているため、オブジェクトが消えることはありませんが、ディープコピーは必要ありません。これは、Objective-Cのメモリ管理の重要なポイントです。メモリ管理プログラミングガイドを読む必要があります。Cocoaのメモリ管理は複雑ではなく、非常に一貫性があります。ThreeMagicWordsに短い要約があります。

于 2011-04-16T15:29:51.793 に答える
2

オブジェクトを配列に追加すると、その保持カウントが増加します。オブジェクトは、保持カウントが0のときに解放されます。したがって、NSStringをanArrayに追加すると、コピーにはなりません(fooを変更でき、配列内でも変更されます)が、fooの保持カウントは増加します。 1で。

NSString *foo = [[NSString alloc] initWithString@"bar"]; // retain count +1
[anArray addObject:foo]; // NOT COPIED, but retain count of 'foo' increased by 1
[foo release]; // retain count of foo decreased by 1

いつかanArrayをリリースすると、そのオブジェクトに対してreleaseが呼び出されます。したがって、fooの保持カウントは最終的に0になり、fooは解放されます。

// some time later..
[anArray release]; // anArray released, foo retain count = 0.. foo gets released.

よろしく、クリスチャン

于 2011-04-16T15:30:13.123 に答える