一、NSKeyedArchiver和NSUserDefault的區別
NSUserDefault只能存儲基本數據類型,如NSInteger NSString NSArray 但像UIImage就存不進去
將各種類型的對象存儲到文件中,而不僅僅是字符串、數組和字典類型,有一種更靈活的方法。就是利用NSKeyedAarchiver類創建帶鍵(keyed)的檔案來完成。
二、用法
所存儲的對象必須必須服從NSSecureCoding協議
1、對於已經服從的類型,如NSString、NSInteger可以直接使用
NSKeyedArchiver-歸檔
//1.對需要保存的數據進行編碼 ->NSdata *
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:@"ios" requiringSecureCoding:YES error:nil]; //2.將二進制數據保存到文件 //創建文件
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"ios.archiver"]; //創建文件
[[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil]; [data writeToFile:path atomically:YES];
NSKeyedUnarchiver-解歸檔
//解歸檔 //獲取文件路徑
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"ios.archiver"]; //讀取文件的內容
NSData *data = [NSData dataWithContentsOfFile:path]; //將二進制數據轉化為對應的對象類型
NSString *str = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSString class] fromData:data error:nil]; NSLog(@"%@", str);
2.對於其他類型,如自己創建的模型,需要服從協議,並且實現某些方法
Person.h
#import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interface Person : NSObject<NSSecureCoding> @property (nonatomic, strong) NSString *name; @property (nonatomic, assign) NSInteger age; @end NS_ASSUME_NONNULL_END
Person.m實現一些方法
#import "Person.h"
@implementation Person + (BOOL)supportsSecureCoding{ return YES; } //歸檔的時候調用 //告訴編碼器該如何歸檔 //將這個對象哪些屬性編碼起來
- (void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:self.name forKey:@"name"]; [aCoder encodeInteger:self.age forKey:@"age"]; } //解歸檔
- (instancetype)initWithCoder:(NSCoder *)aDecoder{ if ([super init]) { self.name = [aDecoder decodeObjectForKey:@"name"]; self.age = [aDecoder decodeIntegerForKey:@"age"]; } return self; }
使用
ViewController.m 歸檔
//創建Person對象
Person *jz = [Person new]; jz.name = @"jz"; jz.age = 12; //1.對需要保存的數據進行編碼 ->NSdata *
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:jz requiringSecureCoding:YES error:nil]; //2.將二進制數據保存到文件 //創建文件
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"ios.archiver"]; //創建文件
[[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil]; [data writeToFile:path atomically:YES];
解歸檔
//解歸檔 //獲取文件路徑
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"ios.archiver"]; //讀取文件的內容
NSData *data = [NSData dataWithContentsOfFile:path]; //將二進制數據轉化為對應的對象類型
Person *jz = [NSKeyedUnarchiver unarchivedObjectOfClass:[Person class] fromData:data error:nil]; NSLog(@"%@", jz);