1. 程式人生 > >iOS 【NSUserDefault -- synchronize 淺析】

iOS 【NSUserDefault -- synchronize 淺析】

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中進行讀取。