</pre><p></p><pre code_snippet_id="1617532" snippet_file_name="blog_20160320_2_6406692" name="code" class="objc">#import <Foundation/Foundation.h>
@interface Person : NSObject<NSCoding>
// 默认会是什么呢?
@property (nonatomic, copy) NSString *name;
// 默认是strong类型
@property (nonatomic, strong) NSMutableArray *array;
@property (nonatomic, assign)NSInteger age;
@end
#import "Person.h"
@implementation Person
//解档
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.array = [aDecoder decodeObjectForKey:@"array"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}
//归档
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.array forKey:@"array"];
[aCoder encodeInteger:self.age forKey:@"age"];
}
- (void)dealloc{
NSLog(@"Person 对象已经销毁!");
}
- (NSString *)description{
NSString *desc = [NSString stringWithFormat:@"name:%@\nage:%ld\narray:%@",self.name,self.age,self.array];
return desc;
}
在viewController.m中:
//(1)第一种方式:归档 (缺点:一个对象保存为一个文件)
NSArray *arrayArchi = @[@"1",@"2",@"3"];
NSString *pathArchi1 = [NSHomeDirectory() stringByAppendingPathComponent:@"archive1"];
BOOL isOK1 = [NSKeyedArchiver archiveRootObject:arrayArchi toFile:pathArchi1];
if (isOK1) {
//解档
NSArray *arrayUnarchi = [NSKeyedUnarchiver unarchiveObjectWithFile:pathArchi1];
NSLog(@"arrayUnarchi:%@",arrayUnarchi);
}
//(2)第二种方式:归档 (优点:多个对象归档为一个文件)
NSString *pathArchi2 = [NSHomeDirectory() stringByAppendingPathComponent:@"archive2"];
NSMutableData *mData = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:mData];
[archiver encodeObject:arrayArchi forKey:@"array"];
[archiver encodeInt:2 forKey:@"number"];
[archiver encodeFloat:3.0 forKey:@"price"];
[archiver finishEncoding];//完成归档,把归档数据赋值到NSMutableData中
[mData writeToFile:pathArchi2 atomically:YES];
//解档
NSMutableData *mDataUnAr = [[NSMutableData alloc] initWithContentsOfFile:pathArchi2];
NSKeyedUnarchiver *unarchivr = [[NSKeyedUnarchiver alloc] initForReadingWithData:mDataUnAr];
NSArray *arrayUnarc = [unarchivr decodeObjectForKey:@"array"];
int number = [unarchivr decodeIntForKey:@"number"];
double price = [unarchivr decodeDoubleForKey:@"price"];
NSLog(@"%@\n%d\n%f\n",arrayUnarc,number,price);
//(3)自定义对象归档,要先实现NSCoding协议,实现两个方法
//- (instancetype)initWithCoder:(NSCoder *)aDecoder;
//- (void)encodeWithCoder:(NSCoder *)aCoder;
NSString *pathArchi3 = [NSHomeDirectory() stringByAppendingPathComponent:@"archive3"];
NSMutableArray *personArray = [NSMutableArray new];
for (int i = 0; i<5; i++) {
Person *person = [[Person alloc] init];
person.name = [NSString stringWithFormat:@"person%d",i+1];
person.age = 20+ arc4random_uniform(10);
person.array = [NSMutableArray arrayWithArray:@[@(i+ arc4random_uniform(10)),@(i+ arc4random_uniform(10))]];
[personArray addObject:person];
}
//归档
BOOL isOK3 = [NSKeyedArchiver archiveRootObject:personArray toFile:pathArchi3];
if (isOK3) {
//解档
NSMutableArray *personArray = [NSKeyedUnarchiver unarchiveObjectWithFile:pathArchi3];
for (Person *person in personArray) {
NSLog(@"%@",person);
}
}