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