8

SupongamosEn ARC, ¿se copian automáticamente los bloques cuando se asignan a un ivar a través de la propiedad?

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

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

es la asignación a la Ivar a través de la @property correcta? Sé que en la gestión manual de la memoria habría necesitado self.ivarResponseHandler = [responseHandler copy]; para asegurarse de que el bloque se haya copiado de la pila al montón. Pero al ver la Sesión 322 - Avances del Objetivo-C en profundidad (minuto 25) de la WWDC 2011, el orador dice que ARC maneja automáticamente la asignación de un bloque a un ivar. Sólo quería estar seguro.

Respuesta

2

bearMountain,

La forma más fácil para asegurar el bloque se copia es, de hecho, configure el @property para usar copia. Como en:

@property (copy, nonatomic) MyResponseHandler ivarResponseHandler; 

Hace todo lo que necesita.

Andrew

+0

No responde la pregunta directamente. Pero creo que usaré este patrón en mi código ahora. – bearMountain

+0

(dos años más tarde) Acabo de hacer una pregunta muy similar que responde la tuya: [¿Debo seguir copiando/bloqueando los bloques en ARC?] (Http://stackoverflow.com/questions/23334863). La conclusión general de la respuesta es que la forma para escribir propiedades para bloques, esta respuesta aceptada aquí, es absolutamente correcta y correcta incluso en los días actuales. –

11

ARC realizará automáticamente la copia para usted en el código que ha publicado.

Si convierte el bloque a id, ARC no no realiza la copia por usted. Por ejemplo, en este código, ARC no realiza la copia porque el tipo de argumento addObject: 's es id:

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

Muchas gracias. Respondió mi pregunta y más. – bearMountain

+0

@adonoho Es cierto que [el bloque no se copia automáticamente si se asigna directamente a un ivar] (http://stackoverflow.com/questions/10453261/under-arc-are-blocks-automatically-copied-when-assigned- to-an-ivar-directamente)? – bearMountain

+0

bearMountain, no sé qué sucede cuando se asigna a un ivar. Francamente, realmente no quiero depender de lo que hará el compilador. Sé que se copia cuando se asigna a una copia '@ property'. También sé que puedes copiar directamente el bloqueo en la asignación al ivar. En ambos casos, no hay ambigüedad. Prefiero siempre usar '@ property's. Andrew – adonoho

Cuestiones relacionadas