web-dev-qa-db-ja.com

ブロック内の変数をブロック外の変数に割り当ててる

エラーが出ます

変数を代入できません(__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;
371
tommi

問題を解決するには、このコード行を使用する必要があります。

__block Person *aPerson = nil;

詳しくは、このチュートリアルを参照してください。 ブロックと変数

754
Devarshi

私も自分自身がした間違いを思い出させるもの

 __block

宣言は、最初に変数を宣言するときに、つまり、ブロックの外側ではなく、その内側では行わないでください。これは、変数がブロックの外側でその値を保持していないことについてのコメントで述べられている問題を解決するはずです。

38
Denis Balko

ブロック内で任意の型の変数を宣言して代入するには、__blockプレフィックスを使用するだけです。

例えば:

__block Person *aPerson = nil;

__block NSString *name = nil;
17
Umesh Sawant
__block Person *aPerson = nil;
10
Ketan Patel

ブロックの外側の変数をその変数の前に常に__block指定子を使用してブロックの内側の変数に割り当てるには、コードは次のようになります。

__block Person *aPerson = nil;
10
Gaurav

保持サイクルに関する警告が表示される場合は__weakを試してください。それ以外の場合は__blockを使用してください。

Person *strongPerson = [Person new];
__weak Person *weakPerson = person;

これで、ブロック内でweakPersonオブジェクトを参照できます。

3
Pebby

yesブロックは最もよく使われる機能なので、保持サイクルを避けるために_weakやweakselfを使用しているにもかかわらず、ブロック内のselfを含む強い変数を使用しないでください。

3
user6311313