@前面講了sqlite存儲數據,現在來說一個存儲類似用戶配置(常見的如判斷App是否是第一次啟動而實現引導頁)數據的類----NSUserDefaults
NSUserDefault的使用比較簡單:
NSUserDefaults *mySettingData =?[NSUserDefaults standardUserDefaults]; ?
創建NSUserDefaults對象之后即可往里面添加數據,它支持的數據類型有NSString、 NSNumber、NSDate、 NSArray、NSDictionary、BOOL、NSInteger、NSFloat等系統定義的數據類型,如果要存放自定義的對象(如自定義的類對象),則必須將其轉換成NSData存儲:
~~~
NSArray *arr = [[NSArray alloc] initWithObjects:@"arr1", @"arr2", nil]
[mySettingData setObject:arr forKey:@"arrItem"];
[mySettingData setObject:@"admin" forKey:@"user_name"];
[mySettingData setBOOL:@YES forKey:@"auto_login"];
[mySettingData setInteger:1 forKey:@"count"];
~~~
@往NSUserDefaults添加數據后,它們就變成了全局的變量,App中即可讀寫NSUserDefault中的數據:
~~~
NSUserDefaults *mySetting = [NSUserDefaults standardUserDefaults];
NSLog(@"arrItem=%@", [mySetting objectForKey:@"arrItem"]);
NSLog(@"user_name=%@", [mySetting objectForKey:@"user_name"]);
NSLog(@"count=%d", [mySetting integerForKey:@"count"]);
~~~
@如果想刪除某個數據項,可以使用removeObjectForKey刪除數據:
[mySetting?removeObjectForKey:@"arrItem"]; ?
@需要注意的是,NSUserDefaults是定時把緩存中的數據寫入磁盤的,而不是即時寫入,為了防止在寫完NSUserDefaults后程序退出導致的數據丟失,可以在寫入數據后使用synchronize強制立即將數據寫入磁盤:
[mySetting?synchronize]; ?
運行上面的語句后,NSUserDefaults中的數據即被寫入到.plist文件中,如果是在模擬器上運行程序,可以在Mac的/Library/Prefereces目錄下面找到一個文件名為com.apple.PeoplePicker.plist的plist文件,用Xcode打開該文件,可以看到剛才寫入的數據。
@pragma mark -引導頁只執行一次
~~~
if(![[NSUserDefaults standardUserDefaults] boolForKey:@"firstStart"]){
這一行-->加入引導頁[self startYinDaoYe]
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"firstStart"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
~~~
@系統定義的數據類型,NSUserDefault**配合NSKeyedArchiver和NSKeyedUnarchiver做本地持久化**
這里用數組做個舉例:
~~~
static NSString *const archiverKey = @"DataArray";
- (void)_testNSKeyedArchiverAndNSKeyedUnarchiver {
NSArray *setDataArray = @[@"1",@"2",@"3"];
NSData *archiverData = [NSKeyedArchiver archivedDataWithRootObject:setDataArray];
[[NSUserDefaults standardUserDefaults] setObject:archiverData forKey:archiverKey];
// 切莫忘記,依舊調用 synchronize 立即寫入沙盒中
[[NSUserDefaults standardUserDefaults] synchronize];
NSArray *getDataArray = [NSArray new];
NSData *unarchiverData = [[NSUserDefaults standardUserDefaults] objectForKey:archiverKey];
getDataArray = [NSKeyedUnarchiver unarchiveObjectWithData:unarchiverData];
NSLog(@" getDataArray = %@",getDataArray);
}
~~~
@切記,數組類型為NSArray的時候可以直接getDataArray = [NSKeyedUnarchiver unarchiveObjectWithData:unarchiverData]; 如果數組類型是NSMutableArray,則必須,getDataArray = [NSMutableArray arrayWithArray:[NSKeyedUnarchiver unarchiveObjectWithData:unarchiverData]]; 否則getDataArray為nil
**@NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary.
如果把一個自定義的類存到一個NSArray里,然后再存到NSUserDefaults里也是不能成功的。
那怎么辦呢?
讓這個自定義類實現協議中的**
**- (id) initWithCoder: (NSCoder *)coder方法**
**- (void) encodeWithCoder: (NSCoder *)coder方法,**
**然后把該自定義的類對象編碼到NSData中,再從NSUserDefaults中進行讀取。**
**具體可以回看我的-->數據持久化(一)序列化與反序列化**
- 前言
- 沙盒機制與文件(一)
- 沙盒機制和文件(二)
- 沙盒機制和文件(三)
- NSBundle介紹以及讀取沙盒文件路徑問題
- 數據持久化(一)-----歸檔 讀寫 文件路徑
- 數據持久化(二)-----Sqlite
- 數據持久化(三)使用第三方類庫FMDB
- 數據持久化(四)之NSUserDefaults
- 數據持久化(五)之CoreData
- 數據持久化(六)之Using CoreData with MagicalRecord
- 數據解析(一)解析XML之系統自帶NSXMLParse類
- 數據解析(二)解析XML之GDataXMLNode
- 數據解析(三)解析JSON-----系統自帶NSJSONSerialization 與 第三方JSONKit
- iOS多線程編程(一)NSThread
- iOS多線程編程(二)NSOperationQueue
- iOS多線程編程(三)Grand Central Dispatch(GCD)詳解
- iOS網絡編程(一)NSURLConnection
- iOS網絡編程(二) 自定義請求網絡類----推薦用于需要請求過程片段數據
- iOS網絡編程(三) 異步加載及緩存圖片---->SDWebImage
- iOS網絡編程(四) 異步加載及緩存圖片-----自定義類
- iOS網絡編程(五) 異步加載及緩存圖片-----EGO
- iOS網絡編程(六) NSURLSession詳解
- iOS網絡編程(7) 第三方開源庫----->AFNetworking