8

AssumereSotto ARC, i blocchi vengono copiati automaticamente quando assegnati a un ivar tramite la proprietà?

typedef void (^MyResponseHandler) (NSError *error); 
@property (strong, nonatomic) MyResponseHandler ivarResponseHandler; 
synthesize ivarResponseHandler = _ivarResponseHandler; 

- (void)myMethod:(MyResponseHandler)responseHandler 
{ 
    self.ivarResponseHandler = responseHandler; 
    ... 
} 

è l'assegnazione al Ivar attraverso il @property corretta? So che nella gestione manuale della memoria avresti avuto bisogno di self.ivarResponseHandler = [responseHandler copy]; per assicurarmi che il blocco fosse stato copiato dallo stack sull'heap. Ma guardando Session 322 - Obiettivi-C Avanzamenti in profondità (minuto 25) dal WWDC 2011, l'oratore dice che ARC gestisce automaticamente l'assegnazione di un blocco a un ivar. Volevo solo essere sicuro.

risposta

2

bearMountain,

Il modo più semplice per garantire il blocco viene copiato è quello, infatti, impostare @property per utilizzare la copia. Come in:

@property (copy, nonatomic) MyResponseHandler ivarResponseHandler; 

Fa tutto il necessario.

Andrew

+0

Non risponde direttamente alla domanda. Ma penso che userò questo modello nel mio codice ora. – bearMountain

+0

(due anni dopo) Ho appena posto una domanda molto simile che rispecchia la tua: [Devo ancora copiare/Block_copy i blocchi sotto ARC?] (Http://stackoverflow.com/questions/23334863). La conclusione generale della risposta è che il modulo per scrivere le proprietà per i blocchi, questa risposta accettata, è assolutamente giusto e corretto anche nei giorni nostri. –

11

ARC eseguirà automaticamente la copia nel codice che hai postato.

Se si converte il blocco in id, ARC non esegue la copia. Ad esempio, in questo codice, ARC non eseguirà la copia perché tipo di argomento addObject: s' è id:

NSMutableArray *array = [NSMutableArray array]; 
[array addObject:responseHandler]; 
+0

Grazie mille. Ho risposto alla mia domanda e altro ancora. – bearMountain

+0

@adonoho È vero che [il blocco non viene copiato automaticamente se assegnato direttamente a un ivar] (http://stackoverflow.com/questions/10453261/under-arc-are-blocks-automatically-copied-when-assigned- a-un-Ivar-diretta)? – bearMountain

+0

bearMountain, non so cosa succede quando viene assegnato ad un ivar. Francamente, non voglio davvero dipendere da ciò che il compilatore farà. So che viene copiato quando assegnato a una copia '@ property'. So anche che puoi copiare direttamente il blocco sul compito assegnato a Ivar. In entrambi i casi, non vi è alcuna ambiguità. Preferisco sempre usare '@ property's. Andrew – adonoho

Problemi correlati