3

ブロックの内容を更新できるプロパティを作成したいと考えています。典型的な変数 (つまり、自動合成されないものなど) については、宣言の前に__block.

ブロックで更新できるプロパティを作成する方法はありますか?

編集:一部の回答は、プロパティセッターメソッドを使用するだけだと言っています。私が実際にやりたいことは、可変配列にオブジェクトを追加することなので、新しい可変配列を作成して、毎回setProperty:またはを使用してプロパティに戻すことは本当にしたくありません。.property =これらすべてのメモリ割り当てなしでプロパティを変更することは可能ですか?

4

4 に答える 4

3

__blockブロックが変更する可能性のあるローカル変数を宣言するために使用されます。

プロパティはローカル変数ではなく、変更可能な配列に何かを追加するだけで変数を変更する必要もありません。変数は変化しません。変化するのは、変数の背後にあるオブジェクトの状態です。

于 2013-09-03T15:57:39.493 に答える
3

これは正しい考え方ではありません。プロパティを持つオブジェクトを変更したいとします。したがって、ブロック内のオブジェクトをキャプチャし、そのアクセサー ( setFoo:) を呼び出してプロパティを変更します。


編集: さまざまな編集から、ObjC オブジェクトがどのように機能し、C++ がどのように機能するかを混乱させる可能性があります。ObjC はオブジェクトへのポインターのみを使用し、それらをめったにコピーせず、オブジェクトの概念を欠いています (不変オブジェクトがありますが、それはミューテーターがないためです。C++ のように可変オブジェクトをconst使用することはできません)。const

__block「この変数 (それが指すオブジェクトではなく、この実際の変数) は、値ではなく参照によってブロックに渡される必要があります)」という意味です。だから私が言うとき:

__block id foo;

これは、fooポインター自体を変更できることを意味します。fooが指すオブジェクトが変異できるかどうかとはまったく関係ありません。これは、グローバルまたは ivar には意味がありません。ivar は暗黙的に構造体フィールドです。ブロック内で言うと_ivar、コンパイラはこれを暗黙的に に変換してからself->_ivarキャプチャしselfます。キャプチャしません_ivar(構造体への単なるオフセットであるためself)。アクセサーを使用して同じことを行う方が良いです。これは、実行していることをより明確にし、__weakその方法を使用できるためです。

于 2013-09-03T15:39:34.047 に答える
2

ブロック内の変数を変更する場合は、__block を使用します。あなたの場合、あなたがしたいことは、変数を変更することではなく(同じを指しますNSMutableArray)、単にメッセージを送信することです(addObject:)。そのために __block は必要ありません。

于 2013-09-03T16:02:16.023 に答える