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


382

エラーが発生する

変数を割り当てることができません(__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;

回答:


780

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

__block Person *aPerson = nil;

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


101
__block先頭に2つのアンダースコアが付いていることに注意してください。
Eric Brotto 2012

12
__block私のエラーの使用はなくなりましたが、値がブロック外に保持されていません。ここでのヘルプ
User16119012

7
ブロックは、呼び出されるべきであるように見えた後によく呼び出されます。つまり、ブロックは「すぐに」実行されません。
トムアンデルセン

1
ブロックがRIGHT AWAYを実行しない場合、これは受け入れられないはずです。
durazno 2016年

3
この回答は投稿された質問に関しては正解です。別のシナリオを考えている場合は、別の質問を投稿してください。
Devarshi 2016年

40

私も自分で間違えたことを思い出させるだけで、

 __block

宣言は、変数を最初に宣言するときに、つまり変数の内部ではなく、ブロックの外側で行う必要があります。これにより、変数のコメントがブロック外でその値を保持しないというコメントで言及された問題が解決されます。


18

__blockプレフィックスを使用して、ブロック内の任意のタイプの変数を宣言して割り当てます。

例えば:

__block Person *aPerson = nil;

__block NSString *name = nil;

10

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

__block Person *aPerson = nil;


3

__weak保持サイクルに関する警告が表示された場合は、他に使用してみてください__block

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

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


3

yesブロックは最もよく使用される機能です。したがって、保持サイクルを回避するために、_weakまたはweakselfを使用しているにもかかわらず、ブロック内のselfを含むstrong変数の使用を避ける必要があります。


0

私は同じエラーを見たとき、私はそれを次のように解決しようとしました:

   __block CGFloat docHeight = 0.0;


    [self evaluateJavaScript:@"document.height" completionHandler:^(id height, NSError *error) {
        //height
        NSLog(@"=========>document.height:@%@",height);
        docHeight = [height floatValue];
    }];

そしてその正常な動作

変数の前に「__block」を追加するだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.