2011-11-01 15 views
347

sto ricevendo un erroreassegnare una variabile all'interno di un blocco ad una variabile all'esterno di un blocco

variabile non è cedibile (manca tipo __block specificatore)

sulla linea 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; 

risposta

699

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

__block Person *aPerson = nil; 

Per ulteriori informazioni, si prega di fare riferimento a questo tutorial: Blocks and Variables

+95

Si noti che '__block' ha come prefisso ** due ** caratteri di sottolineatura. –

+9

usando '__block' il mio errore è scomparso, ma il valore non viene mantenuto fuori dal blocco. Qualsiasi aiuto qui – User16119012

+7

Il blocco viene chiamato molto dopo dove sembra debba essere chiamato, in altre parole, i blocchi non vengono eseguiti 'subito'. –

10

Per assegnare una variabile all'interno di blocco che al di fuori di blocco utilizzare sempre __block specificatore prima di tale variabile il codice dovrebbe essere come questo: -

__block Person *aPerson = nil; 
16

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

Ad esempio:

__block Person *aPerson = nil; 

__block NSString *name = nil; 
30

Solo un promemoria di un errore io stesso ho fatto troppo, la dichiarazione

__block 

deve essere fatto quando prima dichiarare una variabile, cioè al di fuori del blocco , non dentro di esso. Questo dovrebbe risolvere i problemi menzionati nei commenti sulla variabile che non mantiene il suo valore al di fuori del blocco.

9
__block Person *aPerson = nil; 
2

Prova __weak se si ottiene alcun preavviso per quanto riguarda mantenere ciclo di utilizzo altro __block

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

Ora è possibile fare riferimento weakPerson oggetto all'interno del blocco.

3

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

Problemi correlati