2012-04-12 62 views
2

我試圖做到這一點在NSUserDefaults中存儲一個空的字典。如何在NSUserDefaults中存儲和檢索NSMutableDictionary?

NSMutableDictionary* fruits = [NSMutableDictionary alloc]; 
[defaults setObject:fruits forKey:@"fruits"]; 

然後再檢索它。

NSMutableDictionary* fruits = [[NSMutableDictionary alloc] initWithDictionary:[defaults objectForKey:@"fruits"]]; 

但是,檢索字典崩潰了我的應用程序。爲什麼?如何在NSUserDefaults中存儲字典?

+0

您確定檢索到崩潰時會發生嗎?第一行缺少'init',當它被添加到'defaults'時會導致崩潰。 – Dondragmer 2012-04-12 06:46:30

回答

17

你得到一個不可變的字典。你不需要在另一個字典中「封裝」它。如果你想讓它可變寫:

NSMutableDictionary* animals = [[defaults objectForKey:@"animals"] mutableCopy]; 

的類NSUserDefaults的提供用於訪問常見類型,如漂浮的簡便方法,雙打,整數,布爾和URL。一個默認對象必須是一個屬性列表,也就是一個實例(或集合的實例組合):NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。如果你想存儲任何其他類型的對象,你通常應該將其存檔以創建一個NSData實例。

從NSUserDefaults返回的值是不可變的,即使您將 可變對象設置爲值。例如,如果將可變字符串 設置爲「MyStringDefault」的值,那麼稍後使用stringForKey檢索 的字符串將是不可變的。

注意:用戶默認的系統(通過NSUserDefaults類以編程方式訪問)使用屬性列表來存儲代表用戶首選項的對象。這種限制似乎從用戶默認系統中排除了許多類型的對象,例如NSColor和NSFont對象。但是,如果對象符合NSCoding協議,它們可以歸檔爲NSData對象,它們是屬性列表兼容的對象。有關如何執行此操作的信息,請參閱「」將NSColor存儲爲用戶默認值「」;儘管本文主要關注NSColor對象,但該過程可以應用於任何可以歸檔的對象。

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsuserdefaults_Class/Reference/Reference.html

+0

謝謝,爲什麼我會得到一個不可修改的字典? – 2012-04-12 06:40:36

+0

更新了答案;因爲NSDictionary是NSMutableDictionary的超類,NSUserDefaults在保存時會自動「轉換」它。 – LuckyLuke 2012-04-12 06:43:49

1

你需要初始化你的字典,並設置作爲對象後。這種方式的作用,它與你的例子相同,但只是正確初始化。

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"someValue", @"someKey", nil]; 
[defaults setObject:dict forKey:@"slovnik"]; 
[dict release]; 
NSLog(@"READ: %@", [defaults objectForKey:@"slovnik"]); 
NSMutableDictionary *newDict = [[NSMutableDictionary alloc] initWithDictionary:[defaults objectForKey:@"slovnik"]]; 
NSLog(@"READ2: %@", newDict); 

現在,我得到登錄控制檯應用程序沒有崩潰:

2012-04-12 08:47:55.030 Test[12179:f803] READ: { 
someKey = someValue; 
} 
2012-04-12 08:47:55.031 Test[12179:f803] READ2: { 
someKey = someValue; 
} 
0
NSMutableDictionary* fruits = [NSMutableDictionary alloc]; 

應該

NSMutableDictionary* fruits = [[NSMutableDictionary alloc] init]; 

你需要分配他們之後總是初始化對象。

3

您可以使用:

節省: 的NSData *數據=的NSKeyedArchiver archivedDataWithRootObject:mutableArray]。 [[NSUserDefaults standardUserDefaults] setObject:stack forKey:@「Your Key」];

檢索: NSMutableArray * mutableArray = [NSKeyedUnarchiver unarchiveObjectWithData:data];