前言:
作為從事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檔案而且也是沒有加密的,所以對安全性要求的資料最好經過加密之後再儲存。