モデルクラス用の汎用エンコーダとデコーダを作成しようとしていました。私は"エンコードメソッド"オブジェクト(NSString、NSNumber、NSArrayなど)とプリミティブ型のすべてのタイプのプロパティを呼び出す方法を見つけようとしていました。そして私は次のことをする人を見た。そしてこれが正しい方法であるかどうか疑問に思っていました。NSCode:プリミティブ型のエンコーダとデコーダ
プロパティ:
@property (assign,nonatomic) int integerP;
@property (assign,nonatomic) float floatP;
@property (assign,nonatomic) BOOL boolP;
Enconderとデコーダコード:
- (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;
}
私はこれが正しい方法であるかどうかわからなかった、または他のプログラムまたはオブジェクトがで書くことができればプリミティブプロパティの同じメモリ空間。
私が正しいと思った方法:上記の方法が正しい場合には、上記とこれとの違いは何ですか
- (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;
}
私がテストし、両方の方法は、正しい値を返していました。
私は理解していません。プリミティブ型をエンコード/デコードするメソッドはすでにあります。なぜそれらを使用しないのですか?私の場合、2番目の方法がより正しいです。 – Bejil