Przypisz zmienną wewnątrz bloku do zmiennej na zewnątrz bloku

381

Dostaję błąd

Zmiennej nie można przypisać (brak specyfikatora typu __block)

na linii aPerson = participant;. Jak mogę się upewnić, że blok ma dostęp do aPersonzmiennej i że aPersonzmienna może zostać zwrócona?

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
źródło

Odpowiedzi:

779

Aby rozwiązać problem, musisz użyć tego wiersza kodu:

__block Person *aPerson = nil;

Aby uzyskać więcej informacji, zapoznaj się z tym samouczkiem: Bloki i zmienne

Devarshi
źródło
101
Uwaga: __blockpoprzedza go dwa znaki podkreślenia.
Eric Brotto,
12
nie ma __blockmojego błędu, ale wartość nie zachowuje się poza blokiem. Każda pomoc tutaj
User16119012
7
Blok jest wywoływany po tym, jak wygląda na to, że powinien zostać wywołany, innymi słowy, bloki nie uruchamiają się „od razu”.
Tom Andersen,
1
Jeśli bloki nie działają PRAWO OD DALEJ, to nie należy akceptować odpowiedzi, ponieważ czyni to ogromną przeszkodę.
durazno
3
Ta odpowiedź jest poprawna w odniesieniu do zadanego pytania. Jeśli masz inny scenariusz, możesz napisać kolejne pytanie.
Devarshi
40

Przypomnienie o pomyłce, którą też popełniłem

 __block

deklaracja musi być wykonana przy pierwszym zadeklarowaniu zmiennej, to znaczy POZA blokiem, a nie wewnątrz niego. To powinno rozwiązać problemy wspomniane w komentarzach dotyczących zmiennej, która nie zachowuje swojej wartości poza blokiem.

Denis Balko
źródło
18

Wystarczy użyć __blockprzedrostka, aby zadeklarować i przypisać dowolny typ zmiennej w bloku.

Na przykład:

__block Person *aPerson = nil;

__block NSString *name = nil;
Umesh Sawant
źródło
10

Aby przypisać zmienną wewnątrz bloku, która poza blokiem zawsze używa specyfikatora __block przed tą zmienną, kod powinien wyglądać następująco: -

__block Person *aPerson = nil;
Gauraw
źródło
10
__block Person *aPerson = nil;
Ketan Patel
źródło
3

Spróbuj, __weakjeśli pojawi się jakieś ostrzeżenie dotyczące zachowania cyklu w innym przypadku__block

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

Teraz możesz skierować weakPersonobiekt do bloku.

PradeepKN
źródło
3

tak blok jest najczęściej używaną funkcjonalnością, więc aby uniknąć cyklu zatrzymania, powinniśmy unikać używania silnej zmiennej, w tym self wewnątrz bloku, inspite użyj _weak lub slave.

użytkownik6311313
źródło
0

Gdy zobaczyłem ten sam błąd, próbowałem go rozwiązać w następujący sposób:

   __block CGFloat docHeight = 0.0;


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

i działa dobrze

Po prostu dodaj „ __block ” przed Zmienną.

Mr.Javed Multani
źródło