objective-c properties automatic-ref-counting objective-c-blocks

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



objective-c properties (2)

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

Si convierte el bloque a una id , ARC no realizará la copia por usted. Por ejemplo, en este código, ARC no realizará la copia porque addObject: ''s argument type is id :

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

Asumir

typedef void (^MyResponseHandler) (NSError *error); @property (strong, nonatomic) MyResponseHandler ivarResponseHandler; synthesize ivarResponseHandler = _ivarResponseHandler; - (void)myMethod:(MyResponseHandler)responseHandler { self.ivarResponseHandler = responseHandler; ... }

¿La asignación al ivar a través de @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.


montaña del oso,

La forma más fácil de garantizar que el bloque se copie es, de hecho, establecer @property para usar copy. Como en:

@property (copy, nonatomic) MyResponseHandler ivarResponseHandler;

Hace todo lo que necesitas.

Andrés