一、對系統類進行歸檔/解檔
第一種:對集合類對象進行歸檔/解檔
歸檔:
NSArray *arr = @[@"one", @1, @"two", @{@"one":@"hello"}, @[@1, @2]];
BOOL ret = [NSKeyedArchiver archiveRootObject:arr toFile:@"文件路徑/arr.archive"];
if (ret) {
NSLog(@"歸檔成功");
}else{
NSLog(@"歸檔失敗");
}
解檔
方法(1)
NSArray *arr1 = [NSKeyedUnarchiver unarchiveObjectWithFile:@"文件路徑/arr.archive"];
NSLog(@"%@", arr1);
方法(2)
NSData *data = [[NSData alloc] initWithContentsOfFile:@"文件路徑/arr.archive"];
NSArray *arr2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSLog(@"%@", arr2);
第二種:非集合類進行歸檔/解檔
NSString *name = @"hello";
NSInteger age = 10;
歸檔:
//創建一個空的二進制數據對象
NSMutableData *mData = [NSMutableData data];
//創建歸檔對象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:mData];
//將數據寫入歸檔的對象
//注意:不同的數據類型用不同的方法
[archiver encodeObject:name forKey:@"Name"];
[archiver encodeInteger:age forKey:@"Age"];
//結束歸檔
[archiver finishEncoding];
//生成歸檔文件
[mData writeToFile:@"文件路徑/test.archive" atomically:YES];
```
####解檔:
NSData *data = [NSData dataWithContentsOfFile:@"文件路徑/test.archive"];
//創建解檔對象
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
//根據key值解檔數據,key值必須要和上面自己設定的key一樣
NSString *str = [unarchiver decodeObjectForKey:@"Name"];
NSInteger age1 = [unarchiver decodeIntegerForKey:@"Age"];
//結束解檔
[unarchiver finishDecoding];
NSLog(@"%@ %ld", str, age1);
#二、對自定義的類進行歸檔/解檔
####Car.h文件
import <Foundation/Foundation.h>
import "Engine.h"
//自定義類歸檔,需要遵守NSCoding協議,并實現協議中方法
@interface Car : NSObject<NSCoding>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger speed;
//如果自定義類里有其他自定義類的屬性,該作為屬性的自定義類頁必須遵守NSCoding協議,并且實現其中的方法
@property (nonatomic, retain) Engine *engine;
@end
####Car.m文件
import "Car.h"
@implementation Car
- (void)dealloc
{
self.name = nil;
self.engine = nil;
[super dealloc];
}
//歸檔的時候自動調用encodeWithCoder
//自定義類歸檔,就是針對類中的成員變量分別歸檔
//如果自定類中包含其他自定義類,其他自定義類也要遵守NSCoding協議
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:@"CarName"];
[aCoder encodeObject:self.engine forKey:@"Engine"];
[aCoder encodeInteger:self.speed forKey:@"Speed"];
}
//解檔的時候自動調用initWithCoder
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
//如果存在繼承關系,且父類遵守NSCoding協議,并實現協議中的方法,子類中實現initWithCoder方法時,需要寫成self = [super initWithCoder:aDecoder]
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:@"CarName"];
// self.engine = [aDecoder decodeObjectForKey:@"Engine"];
//與上面寫法等價
_engine = [[aDecoder decodeObjectForKey:@"Engine"] retain];
self.speed = [aDecoder decodeIntegerForKey:@"Speed"];
}
return self;
}
@end
####Engine.h
import <Foundation/Foundation.h>
@interface Engine : NSObject<NSCoding>
@property (nonatomic, copy) NSString *name;
@end
####Engine.m
import "Engine.h"
@implementation Engine
(void)dealloc
{
self.name = nil;
[super dealloc];
}(void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:@"EngineName"];
}(instancetype)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:@"EngineName"];
}
return self;
}
@end