これは正しい考え方ではありません。プロパティを持つオブジェクトを変更したいとします。したがって、ブロック内のオブジェクトをキャプチャし、そのアクセサー ( setFoo:
) を呼び出してプロパティを変更します。
編集: さまざまな編集から、ObjC オブジェクトがどのように機能し、C++ がどのように機能するかを混乱させる可能性があります。ObjC はオブジェクトへのポインターのみを使用し、それらをめったにコピーせず、オブジェクトの概念を欠いています (不変オブジェクトがありますが、それはミューテーターがないためです。C++ のように可変オブジェクトをconst
使用することはできません)。const
__block
「この変数 (それが指すオブジェクトではなく、この実際の変数) は、値ではなく参照によってブロックに渡される必要があります)」という意味です。だから私が言うとき:
__block id foo;
これは、foo
ポインター自体を変更できることを意味します。foo
が指すオブジェクトが変異できるかどうかとはまったく関係ありません。これは、グローバルまたは ivar には意味がありません。ivar は暗黙的に構造体フィールドです。ブロック内で言うと_ivar
、コンパイラはこれを暗黙的に に変換してからself->_ivar
キャプチャしself
ます。キャプチャしません_ivar
(構造体への単なるオフセットであるためself
)。アクセサーを使用して同じことを行う方が良いです。これは、実行していることをより明確にし、__weak
その方法を使用できるためです。