objective-c – NSCode:原始类型的编码器和解码器

前端之家收集整理的这篇文章主要介绍了objective-c – NSCode:原始类型的编码器和解码器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图为我的模型类创建一个通用的编码器和解码器.我试图找到一种方法来为所有类型的属性调用“编码方法”,无论是对象(NSString,NSNumber,NSArray等)还是原始类型.我看到有人在做以下事情.我想知道这是否是一种正确的方法.

属性

@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;
}

我测试了,两种方法都返回了正确的值.

解决方法

两种方法都有效.

第一个特别聪明,因为valueForKey:将始终返回一个NSObject,即使该值实际上是一个原语,所以float / int / bool类型将由KVC getter自动包装在NSNumber中,并在KVC setter中解包.

可以使用它来实现某些通用编码/解码函数,这些函数属性键数组上运行.

但是,第二个例子是标准的方法,以及我可能推荐的方式.有时您必须编写样板代码

猜你在找的C&C++相关文章