私はブロックが初めてです。ブロック メソッド内でアクセスできる iVar NSMutableArray を作成したいのですが、_block キーワードを使用して宣言する方法を教えてください。
@interface ViewController : UIViewController
{
__block NSMutableArray *array;
}
@property (nonatomic, weak) NSMutableArray *array;
私はブロックが初めてです。ブロック メソッド内でアクセスできる iVar NSMutableArray を作成したいのですが、_block キーワードを使用して宣言する方法を教えてください。
@interface ViewController : UIViewController
{
__block NSMutableArray *array;
}
@property (nonatomic, weak) NSMutableArray *array;
__block
iVarの前にを設定する必要はありません。
ブロックがコピーされると、ブロック内で使用されるオブジェクト変数への強力な参照が作成されます。メソッドの実装内でブロックを使用する場合:
- 参照によってインスタンス変数にアクセスする場合、自己への強力な参照が行われます。
- 値でインスタンス変数にアクセスする場合、変数への強力な参照が行われます。
init
通常、 and以外から ivar にアクセスするべきではありませんdealloc
。したがって、ブロック内から ivar に直接アクセスする理由はほとんどありません。代わりに、ivar (多くの場合self
) を所有するオブジェクトでアクセサーを使用します。
マルチスレッド ブロックの場合、これは次のようになります。
__weak id weakself = self;
[obj doSomethingWithBlock:^{
id strongself = weakself;
strongself.array = nil; // Can't safely read from the array here without more code.
}];
これがマルチスレッド操作でない場合は、次のようにするだけです。
__weak id weakself = self;
[obj doSomethingWithBlock:^{
NSLog(@"%@", weakself.array[0]);
}];
保持ループの危険がない場合 (ブロックがこのスレッドですぐに実行されるため)、これをさらに簡単に行うことができます。
[obj doSomethingWithBlock:^{
NSLog(@"%@", self.array[0]);
}];