2016-03-09 7 views
8

ARCの知識は今日テストされましたが、私はthis articleに遭遇し、 "Nesting of statements"という見出しの下に例があります。彼らは上記の組み込みを示した例でARCはメソッドパラメータ内に割り当てられたオブジェクトを保持します

example

、ラインは緑の下線で強調表示関数内alloced文字列が最初に作成されたときに追加する際、再び+1カウント数+1を保持になるだろうと述べています配列の最後にnilされた後は、文字列の保持カウントは1だけ減少し、元の文字列の保持カウントは1になり、割り当てが解除されません。

私は、コンパイラは、少なくともあなただけの

[[NSString alloc] initWithFormat:@"Name 1"]]; 

を持っていた場合allocedされ、この文字列が何もないであろうから、そのようなオブジェクトは、実際に、最初は、カウントを保持していないようにするには十分にスマートだっただろうと想定しているだろうそれを指していて、自動解放プールが1の保持カウントを永久に持たずに終了したときに解放されます。それでは、なぜそれが関数のパラメータにあるときに、それは異なる振る舞いをしますか? (その行に1の保持カウントがあり、これは何とかメモリリークですか?そうでなければ、範囲の最後まで1の保持カウントを持つ可能性がありますが、その論理も同様に適用されます私は仮定します)

この記事は間違っていますか、またはARCの私の理解に欠陥がありますか?

+0

記事が間違っています。そしてなぜ彼らが 'alloc init'を表示し続けているのか、メソッドスコープで使うための便利なメソッドを持っています... Weird。 –

+2

記事は間違っています(下記のように)。 http://clang.llvm.org/docs/AutomaticReferenceCounting.html#retained-return-values:* "このような関数やメソッドから返された結果を受け取ると、ARCはその値をローカル変数の通常の最適化を条件として、その中に含まれている完全な式の終わりです。 "* - ' name = nil'と 'array = nil'の両方は、" ARC release memoryを助ける "必要はありません。 –

答えて

5

この記事は間違っています。

あなたの理解は本質的に正しいですが、この場合はオートリリースプールは使用されません。サブ式:

[[NSString alloc] initWithFormat:@"Name 1"]]; 

はすべてinitのように所有オブジェクトを返します。そのオブジェクトはaddObject:に渡され、配列も所有権を持ちます。その後、ARCは、文字列がメソッドで必要なくなったことを確認し、所有権を放棄します。アレイは唯一の所有者になります。

HTH

+0

を見つけた人を見いだすかもしれないので、パラメータがなければ放棄するだけですそれが宣言された直後の所有権ですが、その時点で解放されていますか、解放される前に自動解放プールの終わりに達していますか?(私はあなたがオートリリースプールを使用していないと言って以来前者と仮定していましたが、あまりにもあいまいですが、あなたが話しているのは明らかにしたいだけです) – Fonix

+0

自動リリースプールではないため、オブジェクト。 – rmaddy

+0

、ありがとう! – Fonix

4

ここではARCに欠陥はありません。記事のような音が間違っています。

ARCは、配列が参照を保持している間に、割り当てられたパラメータオブジェクトを期待どおりに解放します。配列が解放されると、オブジェクトは参照を持たなくなり、期待どおりに割り当て解除されます。

+0

もう少し多くの人々が私たちに同意することができれば、記事のコメントセクションにこれを投稿して、おそらく彼らや他の誰かが記事 – Fonix

関連する問題