用NSCoding协议完成“编码/解码”操作-Object-C
2015-06-03 16:11
330 查看
原文:http://blog.sina.com.cn/s/blog_7b9d64af01019kk5.html
Object-C中我们可以对 NSDate, NSNumber, NSString, NSArray, or NSDictionary对象进行“编码/解码”的操作。
但是,当我们对自己定义的对象进行“编码/解码”操作时,却需要实现NSCoding协议的相关方法来告诉程序如何来“编码/解码”我们自己的对象!
NSCoding协议的方法:
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (id)initWithCoder:(NSCoder *)aDecoder;
那么,我们就对类实现“编码/解码”协议:
在AddressCard.h中,申明实现NSCoding协议:
@interface AddressCard : NSObject<NSCopying,NSCoding>
在AddressCard.m中,实现NSCoding协议的编码/解码 方法:
#pragma mark- NSCoding
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:@"AddressCard_name"];
[aCoder encodeObject:self.email forKey:@"AddressCard_email"];
[aCoder encodeInt32:self.salary forKey:@"AddressCard_salary"];
}
- (id)initWithCoder:(NSCoder *)aDecoder{
_name=[[aDecoder decodeObjectForKey:@"AddressCard_name"] retain];
_email=[[aDecoder decodeObjectForKey:@"AddressCard_email"] retain];
_salary=[aDecoder decodeInt32ForKey:@"AddressCard_salary"];
return self;
}
这样,我们就能够归档自己定义的类对象。
NSString *filePhyName=[filePath stringByAppendingPathComponent:@"ObjectFile"];
BOOL isSuccess=NO;
isSuccess= [NSKeyedArchiver archiveRootObject:objArray toFile:filePhyName];
if (isSuccess) {
NSLog(@"Success");
}else{
NSLog(@"False");
}
// 反归档
NSMutableArray *myObj=[NSKeyedUnarchiver unarchiveObjectWithFile:filePhyName];
for (AddressCard *theCard in myObj) {
[theCard print];
}
从输出可以看到,归档成功!
归档需要注意的是:
1.同一个对象属性,编码/解码的key要相同!
2.每一种基本数据类型,都有一个相应的编码/解码方法。
如:encodeObject方法与decodeObjectForKey方法,是成对出现的。
3.如果一个自定义的类A,作为另一个自定义类B的一个属性存在;那么,如果要对B进行归档,那么,B要实现NSCoding协议。并且,A也要实现NSCoding协议。
--------------------------------------------------------------
[b]还有一个[/b]
Object-C中我们可以对 NSDate, NSNumber, NSString, NSArray, or NSDictionary对象进行“编码/解码”的操作。
但是,当我们对自己定义的对象进行“编码/解码”操作时,却需要实现NSCoding协议的相关方法来告诉程序如何来“编码/解码”我们自己的对象!
NSCoding协议的方法:
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (id)initWithCoder:(NSCoder *)aDecoder;
那么,我们就对类实现“编码/解码”协议:
在AddressCard.h中,申明实现NSCoding协议:
@interface AddressCard : NSObject<NSCopying,NSCoding>
在AddressCard.m中,实现NSCoding协议的编码/解码 方法:
#pragma mark- NSCoding
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:@"AddressCard_name"];
[aCoder encodeObject:self.email forKey:@"AddressCard_email"];
[aCoder encodeInt32:self.salary forKey:@"AddressCard_salary"];
}
- (id)initWithCoder:(NSCoder *)aDecoder{
_name=[[aDecoder decodeObjectForKey:@"AddressCard_name"] retain];
_email=[[aDecoder decodeObjectForKey:@"AddressCard_email"] retain];
_salary=[aDecoder decodeInt32ForKey:@"AddressCard_salary"];
return self;
}
这样,我们就能够归档自己定义的类对象。
NSString *filePhyName=[filePath stringByAppendingPathComponent:@"ObjectFile"];
BOOL isSuccess=NO;
isSuccess= [NSKeyedArchiver archiveRootObject:objArray toFile:filePhyName];
if (isSuccess) {
NSLog(@"Success");
}else{
NSLog(@"False");
}
// 反归档
NSMutableArray *myObj=[NSKeyedUnarchiver unarchiveObjectWithFile:filePhyName];
for (AddressCard *theCard in myObj) {
[theCard print];
}
从输出可以看到,归档成功!
归档需要注意的是:
1.同一个对象属性,编码/解码的key要相同!
2.每一种基本数据类型,都有一个相应的编码/解码方法。
如:encodeObject方法与decodeObjectForKey方法,是成对出现的。
3.如果一个自定义的类A,作为另一个自定义类B的一个属性存在;那么,如果要对B进行归档,那么,B要实现NSCoding协议。并且,A也要实现NSCoding协议。
--------------------------------------------------------------
[b]还有一个[/b]
使用NSSecureCoding协议进行对象编解码
原文:http://blog.jobbole.com/67655/相关文章推荐
- Objective-C Runtime
- [Objective-C]关联(objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects)
- Swift项目兼容Objective-c问题汇总
- Javascript与Objective-C 字符串与数组的方法类比
- Objective-c之Singletone模式
- iOS开发(Objective-C)常用库索引
- 中兴手机使用webview出现NPObject deleted问题
- Objective-C中的instancetype和id关键字
- Object-C 声明属性为什么用下划线,代码规范和编程风格
- Objective-C学习——中文URL编码和解码
- Objective-C编码规范:26个方面解决iOS开发问题
- PHP“Cannot use object of type stdClass as array”
- [iOS] performSelector:withObject:afterDelay:调用没有作用的问题及解决方法
- object_getClassName swift得到类名
- Could not import Objective-C header
- PHP Object对象转换为Array数组
- a different object with the same identifier value was already associated with异常解决
- Objective-C 基础教程 正式协议
- Compare .NET Objects对象比较组件
- deleted object would be re-saved by cascade (remove deleted object from associations): [com.bp.bean