tutorial español objective-c dynamic override getter

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)