偏好设置-实例代码:
// 存数据
- (IBAction)save:(id)sender {
// 偏好设置NSUserDefaults
// 底层就是封闭了⼀个字典,利⽤字典的⽅式生成plist⽂件
// 好处:不需要关⼼文件名(它会自动生成)快速进⾏键值对存储.
NSUserDefaults *defautls = [NSUserDefaultsstandardUserDefaults];
[defautls setObject:@"gaowei" forKey:@"name"];
[defautls setBool:YES forKey:@"isBool"];
[defautls setInteger:5 forKey:@"num"];
//同步,⽴即写入文件.
[defautls synchronize];
}
// 读数据
- (IBAction)reader:(id)sender {
// 存是⽤什么key存的, 读的时候就要用什么key值取
// 存的时候使⽤的什么类型,取的时候也要用什么类型.
NSString *str = [[NSUserDefaults standardUserDefaults] objectForKey:@"name"];
BOOL isBool = [[NSUserDefaultsstandardUserDefaults] boolForKey:@"isBool"];
NSInteger num = [[NSUserDefaults standardUserDefaults] integerForKey:@"num"];
NSLog(@"name =%@-isBool=%d-num=%ld",str,isBool,num);
}
归档-实例代码:
// 保存数据
- (IBAction)save:(id)sender {
// 归档⼀般都是保存自定义对象的时候,使用归档.因为plist文件不能够保存自定义对象.
// 如果一个字典当中保存有自定义对象,如果把这个字典写⼊到文件当中,它是不会⽣成plist⽂件的.
Persion *persion = [[Persion alloc] init];
persion.name = @"gaowei";
persion.age = 18;
// 获取沙盒临时目录
NSString *tempPath = NSTemporaryDirectory();
NSString *filePath = [tempPath stringByAppendingPathComponent:@"persion.data"];
// archiveRootObject这个⽅法底层会去调用保存对象的encodeWithCoder⽅法,去询问要保存这个对象的哪些属性.
// 所以要实现encodeWithCoder方法, 告诉要保存这个对象的哪些属性.
[NSKeyedArchiver archiveRootObject:persion toFile:filePath];
}
// 读取数据
- (IBAction)reader:(id)sender {
// 获取沙盒临时目录
NSString *tempPath = NSTemporaryDirectory();
NSString *filePath = [tempPath stringByAppendingPathComponent:@"persion.data"];
// NSKeyedUnarchiver会调⽤initWithCoder这个⽅法,来让你告诉它去获取这个对象的哪些属性.
// 所以我们在保存的对象当中实现initWithCoder⽅法.
Persion *persion = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"name=%@---age=%d",persion.name,persion.age);
}
要保存的对象
#import <Foundation/Foundation.h>
// 要遵守<NSCoding>协议
@interface Persion : NSObject <NSCoding>
@property (nonatomic, strong) NSString *name;
@property(nonatomic, assign) int age;
@end
// archiveRootObject这个方法底层会去调用保存对象的encodeWithCoder⽅法,去询问要保存这个对象的哪些属性.
// 只有遵守了NSCoding协议之后才能够实现这个方法.
-(void)encodeWithCoder:(NSCoder *)encode {
[encode encodeObject:self.name forKey:@"name"];
[encode encodeInt32:self.age forKey:@"age"];
}
// NSKeyedUnarchiver会调用initWithCoder这个方法,来让你告诉它去获取这个对象的哪些属性.
// initWithCoder什么时候调用:解析一个文件的时候就会调用.
-(instancetype)initWithCoder:(NSCoder *)decoder {
// 这个地⽅为什么没有[super initWithCoder]
// 是因为它的父类没有遵守NSCoding协议
if (self = [super init]) {
// 要给它⾥⾯的属性进行赋值,外界取得对象时访问该属性,里⾯才会用值.
self.age = [decoder decodeInt32ForKey:@"age"];
self.name = [decoder decodeObjectForKey:@"name"];
}
return self;
}