1、偏好設置—多用于用戶名、是否自動登錄等數據存儲
很多iOS應用都支持偏好設置,比如保存用戶名、密碼、字體大小等設置,iOS提供了一套標準的解決方案來為應用加入偏好設置功能
每個應用都有個NSUserDefaults實例(有切僅有一個),通過它來存取偏好設置,比如,保存用戶名、字體大小、是否自動登錄
(1)保存內容設置
1 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// 將用戶名存儲2 [defaults setObject:@"JFCK" forKey:@"username"];
// 將字體尺寸儲存3 [defaults setFloat:18.0f forKey:@"text_size"];
(2)讀取上次保存的設置
1 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];2 // 讀取username這個key的值3 NSString *username = [defaults stringForKey:@"username"];4 // 讀取text_size這個key的值
5 float textSize = [defaults floatForKey:@"text_size"];
6 // 讀取auto_login這個key的值
7 BOOL autoLogin = [defaults boolForKey:@"auto_login"];
(3)注意:UserDefaults設置數據時,不是立即寫入,而是根據時間戳定時地把緩存中的數據寫入本地磁盤。所以調用了set方法之后數據有可能還沒有寫入磁盤應用程序就終止了。出現以上問題,可以通過調用synchornize方法強制寫入
1 [defaults synchornize];
2、plist存儲—字典、數組存儲
(1) 數據儲存:
1】獲取Cache文件路徑:
// 獲取Cache文件路徑
// NSSearchPathDirectory:搜索的目錄
// NSSearchPathDomainMask:搜索范圍 NSUserDomainMask:表示在用戶的手機上查找
// expandTilde 是否展開全路徑,如果沒有展開,應用的沙盒路徑就是~
// 存儲一定要要展開路徑
NSString *cachePaht = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
2】拼接文件名:
NSString *filePath = [cachePaht stringByAppendingPathComponent:@"Arr.plist"];
3】將信息寫入文件:
// File:文件的全路徑
[arr writeToFile:filePath atomically:YES];
示例:
1 - (void)saver { 2 // 如何判斷一個對象能不能使用Plist,就看下有沒有writeToFile 3 NSArray *arr = @[@"123",@1]; 4 // 獲取Cache文件路徑 5 // NSSearchPathDirectory:搜索的目錄 6 // NSSearchPathDomainMask:搜索范圍 NSUserDomainMask:表示在用戶的手機上查找 7 // expandTilde 是否展開全路徑,如果沒有展開,應用的沙盒路徑就是~ 8 // 存儲一定要要展開路徑 9 NSString *cachePaht = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];10 // 拼接文件名11 NSString *filePath = [cachePaht stringByAppendingPathComponent:@"Arr.plist"];12 // File:文件的全路徑13 [arr writeToFile:filePath atomically:YES];14 }
數據讀取:
1 - (void)read {2 // 獲取Cache文件路徑3 NSString *cachePaht = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];4 // 拼接文件名5 NSString *filePath = [cachePaht stringByAppendingPathComponent:@"arr.plist"];6 NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];7 NSLog(@"%@",arr);8 }
3、NSKeyedArchiver歸檔解檔(NSCoding)
如果對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型,可以直接用NSKeyedArchiver進行歸檔和恢復;
不是所有的對象都可以直接用這種方法進行歸檔,只有遵守了NSCoding協議的對象才可以。
NSCoding協議有2個方法:
1、encodeWithCoder:
每次歸檔對象時,都會調用這個方法。一般在這個方法里面指定如何歸檔對象中的每個實例變量,可以使用encodeObject:forKey:方法歸檔實例變量。
2、initWithCoder:
每次從文件中恢復(解碼)對象時,都會調用這個方法。一般在這個方法里面指定如何解碼文件中的數據為對象的實例變量,可以使用decodeObject:forKey方法解碼實例變量。
完整實例:存取聯系人的名字、電話號碼信息數據:
1、在數據模型的頭文件中正常定義屬性和聲明類方法(實例化對象的方法)
1 #import <Foundation/Foundation.h> 2 3 @interface ICKContact : NSObject<NSCoding> 4 5 @PRoperty (nonatomic, strong) NSString *name; 6 7 @property (nonatomic, strong) NSString *phone; 8 9 + (instancetype)contactWithName:(NSString *)name andPhone:(NSString *)phone;10 11 @end
2、在數據模型的實現文件中,除了實現實例化對象的類方法以外,還需從新實現實例化對象的對象方法和存儲屬性的方法:
1 #import "ICKContact.h" 2 3 @implementation ICKContact 4 // 實例化數據模型方法 5 + (instancetype)contactWithName:(NSString *)name andPhone:(NSString *)phone 6 { 7 ICKContact *contact = [[ICKContact alloc] init]; 8 contact.name = name; 9 contact.phone = phone;10 return contact;11 }12 // 遵守歸檔協議需調用的方法13 - (void)encodeWithCoder:(NSCoder *)aCoder14 {15 [aCoder encodeObject:self.name forKey:@"name"];16 [aCoder encodeObject:self.phone forKey:@"phone"];17 }18 19 // 遵守歸檔協議需調用的方法20 - (instancetype)initWithCoder:(NSCoder *)aDecoder21 {22 // super是否也實現(initWithCoder:aDecoder)方法,取決于父類super是否也遵守了NSCoding協議23 if (self = [super init]) {24 self.name = [aDecoder decodeObjectForKey:@"name"];25 self.phone = [aDecoder decodeObjectForKey:@"phone"];26 }27 return self;28 }29 30 @end
3、存儲數據:在需要存儲數據的文件中實現
1 // 獲取全路徑2 NSString *cache = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];3 NSString *path = [cache stringByAppendingString:@"contacts.data"];4 // 以數組形式寫入(底層中還是以一個一個對象的形式進行存儲)5 // self.contacts :數據模型數組(此處實現就省略了)6 [NSKeyedArchiver archiveRootObject:self.contacts toFile:path];
4、獲取數據:
1 NSString *cache = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];2 NSString *path = [cache stringByAppendingString:@"contacts.data"];3 _contacts = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
新聞熱點
疑難解答