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;

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


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.


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;

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;


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 .


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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.