wake-up-neo.com

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

Ich erhalte einen Fehler

Variable ist nicht zuweisbar (fehlende __block Typangabe)

an der Leitung aPerson = participant;. Wie kann ich sicherstellen, dass der Block auf die Variable aPerson zugreifen kann und die Variable aPerson 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;
373
tommi

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

__block Person *aPerson = nil;

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

760
Devarshi

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

 __block

die Deklaration muss erfolgen, wenn die Variable zuerst deklariert wird, dh AUSSERHALB des Blocks, nicht innerhalb des Blocks. Dies sollte Probleme lösen, die in den Kommentaren erwähnt wurden, dass die Variable ihren Wert nicht außerhalb des Blocks beibehält.

39
Denis Balko

Benutze einfach das __block Präfix, um einen beliebigen Variablentyp innerhalb eines Blocks zu deklarieren und zuzuweisen.

Zum Beispiel:

__block Person *aPerson = nil;

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

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;
10
Gaurav

Versuchen __weak Wenn Sie eine Warnung bezüglich des Aufbewahrungszyklus erhalten, verwenden Sie __block

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

Jetzt können Sie weakPerson Objekt innerhalb des Blocks verweisen.

3
Pebby

yes-Block ist die am häufigsten verwendete Funktion. Um den Retain-Zyklus zu vermeiden, sollten wir die Verwendung der starken Variablen, einschließlich self, innerhalb des Blocks vermeiden. Verwenden Sie stattdessen _weak oder weakself.

3
user6311313