0

これは基本的な質問であり、以前に質問されたかどうかを確認するために何を検索すればよいかよくわかりません。

多くの例で、プロパティの割り当てが次のように処理されるのを見てきました。

NSArray *tempArray = [/*some code to get array*/];
self.propertyArray = tempArray;
[tempArray release];

なぜそうしないのですか?

self.propertyArray = [/*some code to get array*/];

2つの違いは何ですか?

4

5 に答える 5

1

この答えは、ARCを使用していないことを前提としています。

最初のコードスニペットは、init以外のメソッドでこれを実行している限り、Appleがプロパティの初期化を推奨する方法です。Appleのコードスニペットがこれを頻繁に行うことに気付くでしょう。それはあなたの記憶を管理することをはるかに簡単にします、そして私の意見ではそれは読みやすくします。

NSArray *tempArray = [[NSArray alloc] initWith....]
self.propertyArray = tempArray;
[tempArray release];

NSArrayの設定方法によっては、2番目のコードスニペットがメモリリークを引き起こす可能性があります。

これはリークになります。propertyArrayの保持カウントは2になります。deallocでインスタンス変数を解放した後も、保持カウントは1になります。これはリークです。

self.propertyArray = [[NSArray alloc] initWith...];

両方とも自動解放されているため、これは問題ありません。これにより、保持カウントが1になります。deallocでインスタンス変数を解放する限り。

// Class Method so autoreleased
self.propertyArray = [NSArray arrayWith....];

// Explicitly declaring autorelease
self.propertyArray = [[[NSArray alloc] initWith.....] autorelease];

それは単に好みの問題です。私は最初の方法を好みます。読みやすく、フォローしやすいと思います。

編集(ARCを使用):

これらのメソッドはすべて、releaseステートメントとautoreleaseステートメントを除いて受け入れられます。

[tempArray release];

ARCが自動的にメモリ管理を処理するため、明示的に解放する必要はありません。これはARCの利点であり、どこでリリースするかを考えるという頭痛の種なしに、必要な数のオブジェクトを作成できます。

また、あなたの財産は異なります。強いか弱いかのどちらかを使用する必要があり、保持しないでください。この場合、強力な解決策になります。

@property (nonatomic, strong) NSArray *tempArray;
于 2012-04-22T18:04:52.430 に答える
1

2番目の例では、プロパティによって保持されているオブジェクトを解放しないため、メモリリークが発生します。

self.propertyArray = [[SomeClass alloc] init];
//                               ^ no release
于 2012-04-22T15:06:22.087 に答える
1

ARCでは、2つのステートメントは実際には同等です(ただし、実際にARCでコンパイルするには、リリース呼び出しを省略する必要があります)。

手動で管理されたメモリのシナリオでは、tempArrayにリリース呼び出しがないため、2番目の例(「直接割り当て」。これは、ivarを設定せずにプロパティセッターを呼び出しているためではありません)でtempArrayをリークします。バランスを取るために、alloc/initです。

有用な区別は、表現力、デバッグ能力、そして最終的にはプログラマーの個人的な好みに還元されます。

于 2012-04-22T17:20:00.220 に答える
0

最初の例は、自動参照カウント(ARC)が登場する前に行われていた方法です。2番目の例は、ARCで正常に機能します。昔ながらの方法で行う必要がない限り、すべてのプロジェクトにARCを選択してください。

于 2012-04-22T15:59:46.090 に答える
0

そのようなコードは、おそらく誰かがそれをより簡単にデバッグする機能を望んでいたことを意味します。基本的に、個別の変数がある場合は、(場合によってはカスタムの)プロパティセッターとゲッターをトリガーせずにデバッガーで出力できます。

于 2012-04-22T16:54:28.790 に答える