iOS:NSUserDefaults知識(shí)點(diǎn)

NSUserDefaults支持的數(shù)據(jù)類型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL.不支持自定義對(duì)象直接存儲(chǔ)注意:對(duì)相同的Key賦值約等于一次覆蓋,要保證每一個(gè)Key的唯一性值得注意的是:NSUserDefaults 存儲(chǔ)的對(duì)象全是不可變的(這一點(diǎn)非常關(guān)鍵,弄錯(cuò)的話程序會(huì)出bug),例如,如果我想要存儲(chǔ)一個(gè) NSMutableArray 對(duì)象,我必須先創(chuàng)建一個(gè)不可變數(shù)組(NSArray)再將它存入NSUserDefaults中去,//獲取系統(tǒng)自帶的NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

NSDictionary *dictionary = [userDefaults dictionaryRepresentation];//removeObjectForKey

二、使用 NSUserDefaults 存儲(chǔ)自定義對(duì)象1、將自定義類型轉(zhuǎn)換為NSData類型我們要做的就是將Student類型變成NSData類型 ,那么就必須實(shí)現(xiàn)歸檔:

這里要實(shí)現(xiàn) 在.h 文件中申明 NSCoding 協(xié)議,再 在 .m 中實(shí)現(xiàn) encodeWithCoder方法和initWithCoder 方法就可以了 :?

```

.h 的代碼 :

//Code start? ? #import

#interface Student : NSObjects

@property (nonatomic, retain) NSString *name;

@property (nonatomic, retain) NSString *sex;

@property (nonatomic, retain) NSString *age;

@end

//Code end

.m中加入代碼 :

//Code start

#import "Student.h"

#implementation Student

- (void) encodeWithCoder:(NSCoder *)coder {

[coder encodeObject:self.name forKey:@"name"];

[coder encodeObject:self.sex forKey:@"sex"];

[coder encodeObject:self.age forKey:@"age"];

}

-(id)initWithCoder:(NSCoder*)coder {

if(self = [super init]) {

self.name = [coder decodeObjectForKey:@"name"];

self.sex = [coder decodeObjectForKey:@"sex"];

self.age = [coder decodeObjectForKey:@"age"];

}

return self;

}

@end

//Code end

```

這樣做就可以將自定義類型轉(zhuǎn)變?yōu)镹SData類型了

2、將自定義類型數(shù)據(jù)存入 NSUserDefaults 中

如果要存儲(chǔ)全班同學(xué)的信息,我們可以建一個(gè)NSMutableArray 來存放全班同學(xué)的信息(里面存儲(chǔ)的全是NSData對(duì)象)在需要存儲(chǔ)的地方加入代碼:

```

//Code start

//首先,要建立一個(gè)可變數(shù)組來存儲(chǔ) NSDate對(duì)象

Student *student = [[Student alloc] ini];

//下面進(jìn)行的是對(duì)student對(duì)象的 name , studentNumber ,sex 的賦值

student.name = @"lady-奕奕";

student.studentNumber = @"3100104006";

student.sex = @"女";

//這是一個(gè)存放全班同學(xué)的數(shù)組

NSMutableArray * dataArray = [NSMutableArray arrayWithCapacity:50];

//將student類型變?yōu)镹SData類型

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:student];

//存放數(shù)據(jù)的數(shù)組將data加入進(jìn)去

[dataArray addObject:data];

//Code end

如果你只想存一個(gè)人的信息,你可以直接將NSData存入NSUserDefaults中 :

//Code start

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:student];

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

[user setObject:data forKey:@"oneStudent"];

//Code end

如果你想存儲(chǔ)全班同學(xué)的信息,你還要用一個(gè)for循環(huán)將data 放入 dataArray中,這里具體的操作就不實(shí)現(xiàn)了,只給出存放的代碼:

//Code start

//記住要轉(zhuǎn)換成不可變數(shù)組類型

NSArray * array = [NSArray arrayWithArray:dataArray];

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

[user setObject:array forKey:@"allStudent"];

//Code end

從NSUserDefaults中取出數(shù)據(jù)在還原也很簡(jiǎn)單,例如還原一個(gè)學(xué)生的數(shù)據(jù):

//Code start

NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

NSdData *data = [user objectForKey:@"oneStudent"];

Student *student = [NSKeyedUnarchiver unarchiveObjectWithData:data];

//Code end

```

總之,NSUserDefaults 在我們編寫代碼中是最常用的一個(gè)永久保存數(shù)據(jù)的方法,也是最簡(jiǎn)單的。

---------------------------------------------------------------------------------------------

遍歷查看NSUserDefaults中的key和Value,可以通過以下方法

NSUserDefaults *defatluts =[NSUserDefaults standardUserDefaults];

NSDictionary *dictionary =[defatluts dictionaryRepresentation];

for (NSString *key in[dictionary allKeys]){

? ? ? ? NSLog(@"key = %@value = %@",key,[defatluts objectForKey:key]);

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容