Assegna una variabile all'interno di un blocco a una variabile esterna a un blocco


382

Sto ricevendo un errore

La variabile non è assegnabile (specificatore del tipo di blocco __ mancante)

sulla linea aPerson = participant;. Come posso assicurarmi che il blocco possa accedere alla aPersonvariabile e che la aPersonvariabile possa essere restituita?

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;

Risposte:


780

È necessario utilizzare questa riga di codice per risolvere il problema:

__block Person *aPerson = nil;

Per ulteriori dettagli, consultare questo tutorial: Blocchi e variabili


101
Si noti che __blockè preceduto da due trattini bassi.
Eric Brotto,

12
usando il __blockmio errore andato, ma il valore non si mantiene fuori blocco. Qualsiasi aiuto qui
Utente16119012,

7
Il blocco viene chiamato bene dopo dove sembra che dovrebbe essere chiamato, in altre parole, i blocchi non corrono "subito".
Tom Andersen,

1
Se i blocchi non funzionano RIGHT AWAY, questa non dovrebbe essere una risposta accettata in quanto ciò rende un grosso problema.
Durazno,

3
Questa risposta è corretta rispetto alla domanda pubblicata, sentiti libero di pubblicare un'altra domanda se hai in mente uno scenario diverso.
Devarshi,

40

Solo un promemoria di un errore che ho fatto anch'io, il

 __block

la dichiarazione deve essere fatta quando si dichiara per la prima volta la variabile, ovvero ESTERNA del blocco, non al suo interno. Ciò dovrebbe risolvere i problemi menzionati nei commenti sulla variabile che non mantiene il suo valore al di fuori del blocco.


18

Basta usare il __blockprefisso per dichiarare e assegnare qualsiasi tipo di variabile all'interno di un blocco.

Per esempio:

__block Person *aPerson = nil;

__block NSString *name = nil;

10

Per assegnare una variabile all'interno del blocco che al di fuori del blocco usa sempre lo specificatore __block prima di quella variabile, il tuo codice dovrebbe essere così: -

__block Person *aPerson = nil;


3

Prova __weakse ricevi qualche avviso sull'uso del ciclo di conservazione, altrimenti__block

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

Ora puoi fare riferimento weakPersonall'oggetto all'interno del blocco.


3

Sì, i blocchi sono le funzionalità più utilizzate, quindi per evitare il ciclo di mantenimento dovremmo evitare di usare la variabile forte, incluso self all'interno del blocco, ispezionando usare _weak o weakself.


0

Quando ho visto lo stesso errore, ho provato a risolverlo come:

   __block CGFloat docHeight = 0.0;


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

e funziona benissimo

Aggiungi " __block " prima di Variabile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.