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.