首先,我们的自定义类型必须遵从于<nscoding>协议。
然后实现两个方法:
- (void)encodeWithCoder:(NSCoder *)aCoder;//归档
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder;//解档
coodingData.h
@interface codingData : NSObject<NSCoding>
@property(nonatomic,strong)NSString *name;
@property(nonatomic,assign)NSUInteger age;
@property(nonatomic,strong)NSArray *soon;
@property(nonatomic,strong)codingDataTest *test;//含有自定义类型的时候,这个自定义类型也要实NSCoding协议
@property(nonatomic,assign)float money;
@end
coodingData.m
#import "codingData.h"
@implementation codingData
@synthesize age;
@synthesize name;
@synthesize soon;
@synthesize test;
@synthesize money;
//归档
-(void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeInteger:age forKey:@"age" ];
[aCoder encodeObject:name forKey:@"name" ];
[aCoder encodeObject:soon forKey:@"soon"];
[aCoder encodeObject:test forKey:@"test"];
[aCoder encodeDouble:money forKey:@"money"];
}
//解档
- (id)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
age = [aDecoder decodeInt32ForKey:@"age"];
name = [aDecoder decodeObjectForKey:@"name"];
soon = [aDecoder decodeObjectForKey:@"soon"];
test = [aDecoder decodeObjectForKey:@"test"];
money = [aDecoder decodeDoubleForKey:@"money"];
}
return self;
}
@end
/
codingData * logData = [[codingData alloc]init];
logData.name = @"wxt";
logData.age = 33;
logData.soon = [[NSArray alloc]initWithObjects:@"1",@"2",@"3", nil];
logData.test = [[codingDataTest alloc]init];
logData.test.p = @"hahaha";
logData.money = 1.57;
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:logData];//转换为NSData类型
codingData *newdata = [NSKeyedUnarchiver unarchiveObjectWithData:data];//转换为原来的类型