Assegna una variabile all’interno di un blocco a una variabile all’esterno di un blocco

Sto ricevendo un errore

La variabile non è assegnabile (identificatore di tipo __block mancante)

sulla riga aPerson = participant; . Come posso assicurarmi che il blocco possa accedere alla variabile aPerson e che la variabile aPerson 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; 

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

 __block Person *aPerson = nil; 

Per maggiori dettagli, fai riferimento a questo tutorial: Blocchi e variabili

Solo un ricordo di un errore che ho fatto anch’io, il

  __block 

la dichiarazione deve essere fatta quando si dichiara la variabile, cioè FUORI dal blocco, non al suo interno. Questo dovrebbe risolvere i problemi menzionati nei commenti sulla variabile che non mantiene il suo valore al di fuori del blocco.

Basta usare il prefisso __block per dichiarare e assegnare qualsiasi tipo di variabile all’interno di un blocco.

Per esempio:

 __block Person *aPerson = nil; __block NSString *name = nil; 

Per assegnare una variabile all’interno del blocco che all’esterno del blocco usi sempre __block specificatore prima di tale variabile il tuo codice dovrebbe essere così:

 __block Person *aPerson = nil; 
 __block Person *aPerson = nil; 

yes block sono le funzionalità più utilizzate, quindi per evitare il ciclo di conservazione dovremmo evitare di usare la variabile strong, incluso self all’interno del blocco, inspite use the _weak o weakself.

Prova __weak se ricevi qualche avvertimento riguardante il ciclo di conservazione altrimenti usa __block

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

Ora puoi riferire weakPerson object weakPerson all’interno del blocco.