首先为什么我们要实现对象的归档了?
原因:有时候需要直接将对象存储 NSUserDefaults 或者plist文件中。
ActivityObj.h 实现NSCoding协议
@interface ActivityObj : NSObject<NSCoding>
@property (nonatomic, strong) NSURL *activityImgUrl; //活动海报
@property (nonatomic, strong) NSString *activityId; //活动Id
@property (nonatomic, strong) NSString *activityName; //活动名称
@property (nonatomic, strong) NSURL *activityLinkUrl; //活动链接
@end
ActivityObj,m 需要实现
encodeWithCoder 和 initWithCoder 方法
#import "ActivityObj.h"
#define ACTIVITYIMG @"activityImg"
#define ACTIVITYID @"activityId"
#define ACTIVUTYNAME @"activityName"
@implementation ActivityObj
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if(self != nil)
{
self.activityImgUrl = [aDecoder decodeObjectForKey:ACTIVITYIMG];
self.activityId = [aDecoder decodeObjectForKey:ACTIVITYID];
self.activityName = [aDecoder decodeObjectForKey:ACTIVUTYNAME];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.activityImgUrl forKey:ACTIVITYIMG];
[aCoder encodeObject:self.activityId forKey:ACTIVITYID];
[aCoder encodeObject:self.activityName forKey:ACTIVUTYNAME];
}
@end
将对象保存到 NSUserDefaults中 需要把对象转成NSData类型
NSUserDefaults *udf = [NSUserDefaults standardUserDefaults];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:obj];
[udf setObject:data forKey:key];
[udf synchronize];
将对象从 NSUserDefaults取出来
id obj = [[NSUserDefaults standardUserDefaults] objectForKey:key];
if([obj isKindOfClass:[NSData class]]){ //如果保存的是对象,那么先取得NSData数据再转成对象,然后返回
return [NSKeyedUnarchiver unarchiveObjectWithData:obj];
}else{
return obj;
}
将对象存储到plist文件中方法类似都是将对象转成NSData进行存储