Estaba intentando crear un codificador y decodificador genérico para mis clases de modelo. Estaba intentando encontrar una forma de llamar al "método de codificación" para todos los tipos de propiedades, ya sean objetos (NSString, NSNumber, NSArray, etc.) y tipos primitivos. Y vi a alguien haciendo lo siguiente. Y me preguntaba si esta sería una forma correcta de hacerlo.NSCode: codificador y decodificador para los tipos primitivos
Propiedades:
@property (assign,nonatomic) int integerP;
@property (assign,nonatomic) float floatP;
@property (assign,nonatomic) BOOL boolP;
Enconder y decodificador Código:
- (void)encodeWithCoder:(NSCoder *)encoder
{
id object2 = [self valueForKey:@"integerP"];
id object3 = [self valueForKey:@"floatP"];
id object4 = [self valueForKey:@"boolP"];
[encoder encodeObject:object2 forKey:@"integerP"];
[encoder encodeObject:object3 forKey:@"floatP"];
[encoder encodeObject:object4 forKey:@"boolP"];
//[self setValue:[NSNumber numberWithInt:90] forKey:@"heightR"];
//NSLog(@"%@",[self valueForKey:@"heightR"]);
}
- (id)initWithCoder:(NSCoder *)decoder
{
self = [super init];
if(self != nil)
{
id object2 = [decoder decodeObjectForKey:@"integerP"];
[self setValue:object2 forKey:@"integerP"];
id object3 = [decoder decodeObjectForKey:@"floatP"];
[self setValue:object3 forKey:@"floatP"];
id object4 = [decoder decodeObjectForKey:@"boolP"];
[self setValue:object4 forKey:@"boolP"];
}
return self;
}
no estaba seguro de si se trata de una forma correcta, o si otro programa u objeto podría escribir en el mismo espacio de memoria de las propiedades primitivas. Si el método anterior es correcta, lo que es la diferencia entre el anterior y este:
La manera que pensé que era correcta:
- (void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeInt:integerP forKey:@"integerP"];
[encoder encodeFloat:floatP forKey:@"floatP"];
[encoder encodeBool:boolP forKey:@"boolP"];
//[self setValue:[NSNumber numberWithInt:90] forKey:@"heightR"];
//NSLog(@"%@",[self valueForKey:@"heightR"]);
}
- (id)initWithCoder:(NSCoder *)decoder
{
self = [super init];
if(self != nil)
{
integerP = [decoder decodeIntForKey:@"integerP"];
floatP = [decoder decodeFloatForKey:@"floatP"];
boolP = [decoder decodeBoolForKey:@"boolP"];
}
return self;
}
Probé y ambos métodos de regresar los valores correctos.
que no entiendo. Ya hay métodos para codificar/decodificar tipos primitivos, ¿por qué no los usaría? Para mí, el segundo método es más correcto. – Bejil