エラーが出ます
変数を代入できません(__block型指定子がありません)
aPerson = participant;
行に。ブロックがaPerson
変数にアクセスでき、aPerson
変数が返されるようにするにはどうすればよいですか
Person *aPerson = nil;
[participants enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
Person *participant = (Person*)obj;
if ([participant.gender isEqualToString:@"M"]) {
aPerson = participant;
*stop = YES;
}
}];
return aPerson;
私も自分自身がした間違いを思い出させるもの
__block
宣言は、最初に変数を宣言するときに、つまり、ブロックの外側ではなく、その内側では行わないでください。これは、変数がブロックの外側でその値を保持していないことについてのコメントで述べられている問題を解決するはずです。
ブロック内で任意の型の変数を宣言して代入するには、__block
プレフィックスを使用するだけです。
例えば:
__block Person *aPerson = nil;
__block NSString *name = nil;
__block Person *aPerson = nil;
ブロックの外側の変数をその変数の前に常に__block指定子を使用してブロックの内側の変数に割り当てるには、コードは次のようになります。
__block Person *aPerson = nil;
保持サイクルに関する警告が表示される場合は__weak
を試してください。それ以外の場合は__block
を使用してください。
Person *strongPerson = [Person new];
__weak Person *weakPerson = person;
これで、ブロック内でweakPerson
オブジェクトを参照できます。
yesブロックは最もよく使われる機能なので、保持サイクルを避けるために_weakやweakselfを使用しているにもかかわらず、ブロック内のselfを含む強い変数を使用しないでください。