Weisen Sie einer Variablen außerhalb eines Blocks eine Variable innerhalb eines Blocks zu

382

Ich erhalte eine Fehlermeldung

Variable ist nicht zuweisbar (fehlender __block-Typbezeichner)

auf der Linie aPerson = participant;. Wie kann ich sicherstellen, dass der Block auf die aPersonVariable zugreifen und die aPersonVariable zurückgegeben werden kann?

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;
tommi
quelle

Antworten:

780

Sie müssen diese Codezeile verwenden, um Ihr Problem zu beheben:

__block Person *aPerson = nil;

Weitere Informationen finden Sie in diesem Tutorial: Blöcke und Variablen

Devarshi
quelle
101
Bitte beachten Sie, dass zwei Unterstriche __blockvorangestellt sind .
Eric Brotto
12
mit __blockmeinem Fehler weg, aber der Wert bleibt nicht außerhalb des Blocks. Jede Hilfe hier
User16119012
7
Der Block wird gut aufgerufen, nachdem er so aussieht, als ob er aufgerufen werden sollte. Mit anderen Worten, Blöcke werden nicht sofort ausgeführt.
Tom Andersen
1
Wenn Blöcke nicht RIGHT AWAY laufen, sollte diese Antwort nicht akzeptiert werden, da dies einen großen Deal Breaker darstellt.
Durazno
3
Diese Antwort ist in Bezug auf die gestellten Fragen korrekt. Wenn Sie ein anderes Szenario im Auge haben, können Sie gerne eine weitere Frage stellen.
Devarshi
40

Nur eine Erinnerung an einen Fehler, den ich selbst gemacht habe

 __block

Die Deklaration muss erfolgen, wenn die Variable zuerst deklariert wird, dh AUSSERHALB des Blocks, nicht innerhalb des Blocks. Dies sollte die in den Kommentaren erwähnten Probleme beheben, bei denen die Variable ihren Wert außerhalb des Blocks nicht beibehält.

Denis Balko
quelle
18

Verwenden Sie einfach das __blockPräfix, um einen beliebigen Variablentyp innerhalb eines Blocks zu deklarieren und zuzuweisen.

Zum Beispiel:

__block Person *aPerson = nil;

__block NSString *name = nil;
Umesh Sawant
quelle
10

Um eine Variable innerhalb eines Blocks zuzuweisen, die außerhalb des Blocks immer den __block-Bezeichner vor dieser Variablen verwendet, sollte Ihr Code folgendermaßen aussehen: -

__block Person *aPerson = nil;
Gaurav
quelle
10
__block Person *aPerson = nil;
Ketan Patel
quelle
3

Versuchen __weakSie es, wenn Sie eine Warnung bezüglich des Aufbewahrungszyklus erhalten__block

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

Jetzt können Sie das weakPersonObjekt innerhalb des Blocks referenzieren .

PradeepKN
quelle
3

Ja-Block sind die am häufigsten verwendeten Funktionen. Um den Aufbewahrungszyklus zu vermeiden, sollten wir die Verwendung der starken Variablen, einschließlich des Selbst innerhalb des Blocks, vermeiden, obwohl Sie _weak oder schwach selbst verwenden.

user6311313
quelle
0

Als ich den gleichen Fehler sah, versuchte ich ihn wie folgt zu beheben:

   __block CGFloat docHeight = 0.0;


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

und es funktioniert gut

Fügen Sie einfach " __block " vor Variable hinzu.

Mr.Javed Multani
quelle