如果只存儲字典一樣的NSData,的NSString,NSNumber的,NSDate的,的NSArray,NSDictionary的或它們的組合內的標準對象你不必做任何特別的事情。但是,如果您有其中的自定義對象(即您創建的類)的實例,則首先需要將其轉換爲兼容類型(例如NSData
)。爲此,可以使用下面的代碼做:
NSData* data=[NSKeyedArchiver archivedDataWithRootObject:json];
[NSUserDefaults standardUserDefaults] setObject:data forKey:@"user"]
對於這種方法的工作,你定義來實現這2種方法中的自定義類,你要保存:
- (id)initWithCoder:(NSCoder*)coder
- (void)encodeWithCoder:(NSCoder*)coder;
爲了得到字典NSUserDefaults的距離(解碼)回你可以使用:
NSData* data = [[NSUserDefaults standardUserDefaults] objectForKey:@"user"];
NSDictionary* json = [NSKeyedUnarchiver unarchiveObjectWithData:data];
編輯
要檢查您的json
對象包含任何[NSNull null]
值,添加這段代碼你正在你的面前插入到NSUserDefaults
for (id val in [json allValues])
{
if ([val isKindOfClass:[NSNull class]])
{
NSLog(@"This bad! NSNull should not be in the dictionary");
break;
}
}
如果你在控制檯的任何This is bad...
的消息,那麼你有2種選擇。 1.使用我上面描述的存檔/解除存檔方法 2.如果這不會破壞您的代碼,請將字典中的NSNull
對象替換爲其他值(例如空字符串)。
我不會建議保存一個龐大的'NSDictionary'作爲用戶的默認值。用戶默認不用於存儲大量的數據,因爲這有'Documents'文件夾。 – holex
他並沒有說這本字典是大量的 –
@AndreiStanescu,......而這正是我爲什麼假設字典是巨大的。 – holex