偏好設(shè)置-實(shí)例代碼:
// 存數(shù)據(jù)
- (IBAction)save:(id)sender {
// 偏好設(shè)置NSUserDefaults
// 底層就是封閉了?個(gè)字典,利?字典的?式生成plist?件
// 好處:不需要關(guān)?文件名(它會(huì)自動(dòng)生成)快速進(jìn)?鍵值對(duì)存儲(chǔ).
NSUserDefaults *defautls = [NSUserDefaultsstandardUserDefaults];
[defautls setObject:@"gaowei" forKey:@"name"];
[defautls setBool:YES forKey:@"isBool"];
[defautls setInteger:5 forKey:@"num"];
//同步,?即寫入文件.
[defautls synchronize];
}
// 讀數(shù)據(jù)
- (IBAction)reader:(id)sender {
// 存是?什么key存的, 讀的時(shí)候就要用什么key值取
// 存的時(shí)候使?的什么類型,取的時(shí)候也要用什么類型.
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);
}
歸檔-實(shí)例代碼:
// 保存數(shù)據(jù)
- (IBAction)save:(id)sender {
// 歸檔?般都是保存自定義對(duì)象的時(shí)候,使用歸檔.因?yàn)閜list文件不能夠保存自定義對(duì)象.
// 如果一個(gè)字典當(dāng)中保存有自定義對(duì)象,如果把這個(gè)字典寫?到文件當(dāng)中,它是不會(huì)?成plist?件的.
Persion *persion = [[Persion alloc] init];
persion.name = @"gaowei";
persion.age = 18;
// 獲取沙盒臨時(shí)目錄
NSString *tempPath = NSTemporaryDirectory();
NSString *filePath = [tempPath stringByAppendingPathComponent:@"persion.data"];
// archiveRootObject這個(gè)?法底層會(huì)去調(diào)用保存對(duì)象的encodeWithCoder?法,去詢問要保存這個(gè)對(duì)象的哪些屬性.
// 所以要實(shí)現(xiàn)encodeWithCoder方法, 告訴要保存這個(gè)對(duì)象的哪些屬性.
[NSKeyedArchiver archiveRootObject:persion toFile:filePath];
}
// 讀取數(shù)據(jù)
- (IBAction)reader:(id)sender {
// 獲取沙盒臨時(shí)目錄
NSString *tempPath = NSTemporaryDirectory();
NSString *filePath = [tempPath stringByAppendingPathComponent:@"persion.data"];
// NSKeyedUnarchiver會(huì)調(diào)?initWithCoder這個(gè)?法,來讓你告訴它去獲取這個(gè)對(duì)象的哪些屬性.
// 所以我們?cè)诒4娴膶?duì)象當(dāng)中實(shí)現(xiàn)initWithCoder?法.
Persion *persion = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"name=%@---age=%d",persion.name,persion.age);
}
要保存的對(duì)象
#import <Foundation/Foundation.h>
// 要遵守<NSCoding>協(xié)議
@interface Persion : NSObject <NSCoding>
@property (nonatomic, strong) NSString *name;
@property(nonatomic, assign) int age;
@end
// archiveRootObject這個(gè)方法底層會(huì)去調(diào)用保存對(duì)象的encodeWithCoder?法,去詢問要保存這個(gè)對(duì)象的哪些屬性.
// 只有遵守了NSCoding協(xié)議之后才能夠?qū)崿F(xiàn)這個(gè)方法.
-(void)encodeWithCoder:(NSCoder *)encode {
[encode encodeObject:self.name forKey:@"name"];
[encode encodeInt32:self.age forKey:@"age"];
}
// NSKeyedUnarchiver會(huì)調(diào)用initWithCoder這個(gè)方法,來讓你告訴它去獲取這個(gè)對(duì)象的哪些屬性.
// initWithCoder什么時(shí)候調(diào)用:解析一個(gè)文件的時(shí)候就會(huì)調(diào)用.
-(instancetype)initWithCoder:(NSCoder *)decoder {
// 這個(gè)地?為什么沒有[super initWithCoder]
// 是因?yàn)樗母割悰]有遵守NSCoding協(xié)議
if (self = [super init]) {
// 要給它??的屬性進(jìn)行賦值,外界取得對(duì)象時(shí)訪問該屬性,里?才會(huì)用值.
self.age = [decoder decodeInt32ForKey:@"age"];
self.name = [decoder decodeObjectForKey:@"name"];
}
return self;
}