属性列表
属性列表是一种XML格式的文件,拓展名为plist
如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,就可以使用writeToFile:atomically:方法直接将对象写到属性列表文件中
读取方法ContentsOfFile
偏好设置 NSUserDefaults
一定要设置数据的持久化[defaults synchornize];
//单例对象
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
//写
[defaults setObject:@"itcast" forKey:@"username"];
[defaults setFloat:18.0f forKey:@"text_size"];
[defaults setBool:YES forKey:@"auto_login"];
//读
NSString *username = [defaults stringForKey:@"username"];
float textSize = [defaults floatForKey:@"text_size"];
BOOL autoLogin = [defaults boolForKey:@"auto_login"];
NSKeyedArchiver
不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以,如果继承父类的属性,那么需要调用super方法将父类进行归档和解归档
归档和解归档的简单步骤
//归档
[NSKeyedArchiver archiveRootObject:self.contacts toFile:PATH];
//解归档
_contacts = [NSKeyedUnarchiver unarchiveObjectWithFile:PATH];
NSKeyedArchiver 归档
一、归档的步骤
1.需要归档的数据结构或是对象,必须遵从归档协议<NSCoding>,并实现协议中相关的方法【注】官方类NSString、NSArray和NSDictionary已经遵从了该协议并且实现了协议方法,不需要在重复遵从
如果当前归档的对象里包含了另外的自定义类那么就该类也应遵守归档协议,并且实现其方法
<NSCoding>协议的相关方法有:
(void)encodeWithCoder:(NSCoder *)aCoder;
当前对象被归档时,会调用这个方法
aCoder参数是一个编码器,是负责归档对象(即将对象转化为二进制)
[aCoder encodeObject:_stuArray forKey:@“stuArray"];
这是对当前对象成员变量进行的的归档操作
(id)initWithCoder:(NSCoder *)aDecoder;
这是一个解归档的方法 而且需要注意的是这是一个构造方法,因此要按照构造方法来实现
-(instancetype)initWithCoder:(NSCoder *)aDecoder
{
//aDecoder解归档器,当解归档当前对象是把它当做参数传进来
if (self = [super init]) {
self.className = [aDecoder decodeObjectForKey:@"clssName"];
self.stuArray = [aDecoder decodeObjectForKey:@"stuArray"];
}
return self;
}
2.使用NSKeyedArchiver进行归档
2.1 创建一个可变二进制对象(即数据包)同一个数据包中可以放入多个对象
NSMutableData * data = [NSMutableData new];
2.2 创建归档对象,并且让它关联数据包
NSKeyedArchiver * kAr = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
2.3将我们所要归档的对象放入数据包中
[kAr encodeObject:class forKey:@“class”];
2.4 封口,归档结束
[kAr finishEncoding];
2.5归档结束后,Class已经被转化二进制并且放入数据包data中,此时就可以把该数据包写入磁盘
[data writeToFile:PATH atomically:NO];
3.解归档
3.1从文件中读出数据
NSData * data1 = [[NSData alloc] initWithContentsOfFile:PATH];
3.2创建解归档对象(负责将数据包取出来并且还原),并且与我们取出来的数据包进行关联
NSKeyedUnarchiver * uKAr = [[NSKeyedUnarchiver alloc] initForReadingWithData:data1];
3.3取数据包中的数据(即解归档)
Class *class1 = [[uKAr decodeObjectForKey:@"class"] retain];
3.4封口,完成解归档
[uKAr finishDecoding];