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;

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


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.


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;

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;


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.


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.


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ą.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.