objective c - español - Objective-C: anula el getter dinámico
solidity español (1)
Tengo una subclase NSManagedObject
MyClass
con una propiedad myProp
, que se define como @dynamic
. Hay varias instancias de lectura de myProp
en mi código, vía [myClass myProp]
.
Ahora, quiero definir un getter (que devuelva myProp
después de agregarle algo) para myProp
, sin cambiar las diversas llamadas a [myClass myProp]. es decir, sin crear un getter llamado algo distinto de getMyProp
.
Mi pregunta es, si creo un getter getMyProp
, que anulará el getter creado por NSManagedObject
, ¿cómo NSManagedObject
al valor original que está almacenado en la base de datos?
Gracias,
Akshay
Para acceder a los valores subyacentes de un objeto administrado, utiliza los dos métodos siguientes:
- clave (id) primitiveValueForKey: (NSString *)
- (void) setPrimitiveValue: (id) value forKey: clave (NSString *)
Esto se usa a menudo para convertir atributos NSNumber en su tipo ''real'', por ejemplo, una propiedad bool:
- (BOOL)isShared
{
[self willAccessValueForKey:@"isShared"];
NSNumber *underlyingValue = [self primitiveValueForKey:@"isShared"];
[self didAccessValueForKey:@"isShared"];
return [underlyingValue boolValue];
}
willAccessValueForKey:
y didAccessValueForKey:
son necesarios para la clase de objeto gestionado subyacente para gestionar fallas y relaciones, etc.
Y si terminas escribiendo un setter, también debes envolver el acceso en métodos KVC:
- (void)setShared:(BOOL)isShared
{
NSNumber *newUnderlyingValue = [NSNumber numberWithBool:isShared];
[self willChangeValueForKey:@"isShared"];
[self setPrimitiveValue:newUnderlyingValue forKey:@"isShared"];
[self didChangeValueForKey:@"isShared"];
}
Habiendo dicho esto, yo personalmente no recomendaría que mantengas el mismo nombre de método a menos que tengas una buena razón. Para los valores ''derivados'' generalmente desea crear un nuevo método con un nombre diferente. No toma mucho tiempo hacer un rápido descubrimiento / reemplazo a través de su código.
EDITAR: se agregó willAccessValueForKey: / didAccessValueForKey: (gracias jrturton)