objective-c – NSCode:原始类型的编码器和解码器
发布时间:2020-12-16 03:39:58 所属栏目:百科 来源:网络整理
导读:我试图为我的模型类创建一个通用的编码器和解码器.我试图找到一种方法来为所有类型的属性调用“编码方法”,无论是对象(NSString,NSNumber,NSArray等)还是原始类型.我看到有人在做以下事情.我想知道这是否是一种正确的方法. 属性: @property (assign,nonatom
我试图为我的模型类创建一个通用的编码器和解码器.我试图找到一种方法来为所有类型的属性调用“编码方法”,无论是对象(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中解包. 可以使用它来实现某些通用编码/解码函数,这些函数在属性键数组上运行. 但是,第二个例子是标准的方法,以及我可能推荐的方式.有时您必须编写样板代码! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- 由quick2升级到cocos2d-x3.8的一些体会
- ruby-on-rails – Rails的良好做法
- net.sf.json.JSONException: There is a cycle i
- c# – 从ConcurrentDictionary转换为IDictionary
- ReactiveCocoa Weak-Strong Dance
- WinCE中nandflash驱动开发介绍
- 用于sqlite3的Windows命令提示符shell
- C++ STL map删除键值对:erase()和clear()方法
- Cocos2d-X 学习笔记4 锚点
- c – bool乘以exclusive-or,not或(与Eigen Matri
热点阅读