IOS資料儲存之NSUserDefaults

總李寫程式碼發表於2016-05-10

前言:

  作為從事Android開發人來說一定聽說過SharedPreferences,然後要成為一名ios開發工程師來說咋能不知道NSUserDefaults!接下來讓我們認識一下。

NSUserDefaults簡介:

           NSUserDefaults是一種儲存輕量級的本地資料方式,NSUserDefaults是一個單例,主要用於資料的永久儲存,簡單實用。試用場景:比如我們儲存一下使用者的登入資訊,一個標識等。支援的資料格式有:NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,BOOL等系統定義的資料型別。上面標記紅色是為了引起大家的注意,自己在寫測試程式的時候寫了一個NSMutableArray 然後儲存,不幸的是直接掛掉,後來查了一下資料,原來NSUserDefaults 儲存的物件全是不可變的!

廢話不多說寫個測試程式看看:

首先儲存一個字串NSString

   //NSUserDefaults 使用
    NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
    NSString *nameForSave =@"whoislcj";
    NSString *key=@"name";
    //儲存資料
    [defaults setObject:nameForSave forKey:key];//根據鍵值對儲存name
    //讀取資料
    NSString *nameForGet = [defaults objectForKey:key];//根據鍵值取出name
    NSLog(@"nameForGet---%@",nameForGet);
    NSLog(@"nameForSave==nameForGet---%i",[nameForGet isEqualToString:nameForSave]);

然後儲存一個NSArray

    NSArray *myArray = [NSArray arrayWithObjects:@"who", @"islcj", nil];
    [defaults setObject:myArray forKey:@"testArray"];
     NSArray *myArray1 = [defaults arrayForKey:@"testArray"];
     NSLog(@"myArray---%@",myArray1);

是不是很簡單,其他的基礎型別就不一一實現了。這個就在想既然是setObject那到底支援不支援自定義物件型別呢,所以寫了個自定義物件

    Person *person1=[[Person alloc]init];
    person1.name=@"whoislcj";
    [defaults setObject:person1 forKey:@"person1"];
    Person *person2=[defaults objectForKey:@"person1"];
    NSLog(@"person2---%@",person2.name);

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject<NSCoding>

@property (nonatomic,strong)NSString *name;

@end

Person.m

#import "Person.h"

@implementation Person

#pragma mark - NSCoding Delegate

-(id)init{
    if(self==nil){
        self =[super init];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:self.name forKey:@"name"];
}

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super init];
    if (self)
    {
        self.name = [aDecoder decodeObjectForKey:@"name"];
    }
    return self;
}

@end

 

執行結果:不幸的事情發生了 ,直接掛掉了,後來查了一下資料NSUserDefaults 本身不支援自定義物件的儲存!那怎麼辦呢,方法就有很多種了,

第一種自定義物件轉化成Json字串儲存,第二種自定義物件轉化成NSData資料。

用過SharedPreferences都知道commit和apply函式,所有想想ios這邊會不會也有這樣的考慮,所以查閱一番原來也是一樣的,僅僅呼叫[defaults

setObject: forKey:]之後NSUserDefaults是定時把快取中的資料寫入磁碟的,而不是即時寫入,為了防止在寫完NSUserDefaults後程式退出導致的資料丟失,可以在寫入資料後使用synchronize強制立即將資料寫入磁碟,具體程式碼如下:

//這裡建議同步儲存到磁碟中,但是不是必須的  
 [defaults synchronize];  

 

接下來又想起來之前用SharedPreferences的資料清除了,那麼NSUserDefaults怎麼清楚資料的呢?

[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];

[[NSUserDefaults standardUserDefaults] synchronize];

值得注意是:

用過SharedPreferences的都知道它的儲存方式是一個xml檔案而且是明文的,其實NSUserDefaults在iOS沙盒中也是一個.plist檔案而且也是沒有加密的,所以對安全性要求的資料最好經過加密之後再儲存。

相關文章