Objective c 将NSDictionary保存到plist:序列化错误
我的应用程序中有一个带有嵌套字典的字典(根据“闪存卡”)。由于某些原因,NSDictionary不会写入文件。若我只是在我的字典上调用writeToFile,它将不起作用,NSPropertyListSerialization返回的属性列表格式无效。代码如下:Objective c 将NSDictionary保存到plist:序列化错误,objective-c,plist,nsdictionary,Objective C,Plist,Nsdictionary,我的应用程序中有一个带有嵌套字典的字典(根据“闪存卡”)。由于某些原因,NSDictionary不会写入文件。若我只是在我的字典上调用writeToFile,它将不起作用,NSPropertyListSerialization返回的属性列表格式无效。代码如下: #import "flashCard.h" #define kFront @"front" #define kBack @"back" @implementation flashCard - (id) init { if (self
#import "flashCard.h"
#define kFront @"front"
#define kBack @"back"
@implementation flashCard
- (id) init
{
if (self = [super init])
{
cards = [[NSDictionary alloc] initWithObjectsAndKeys:
[[NSDictionary alloc] initWithObjectsAndKeys:
@"aetas/aetatis", kFront,
@"lifetime, age, generation", kBack,
nil], [NSNumber numberWithInt: 1],
[[NSDictionary alloc] initWithObjectsAndKeys:
@"amicitia/amicitiae", kFront,
@"alliance, friendship", kBack,
nil], [NSNumber numberWithInt: 2],
[[NSDictionary alloc] initWithObjectsAndKeys:
@"amicus/amici", kFront,
@"friend", kBack,
nil], [NSNumber numberWithInt: 3],
[[NSDictionary alloc] initWithObjectsAndKeys:
@"animus/animi", kFront,
@"mind, heart, spirit, courage", kBack,
nil], [NSNumber numberWithInt: 4],
nil];
currentSide = [[NSString alloc] init];
currentCard = 1;
currentSide = kFront;
}
return self;
}
后来,在相同的实现中
- (void) saveSet
{
NSLog(@"saveSet called");
NSSavePanel *cocaoSavePanel = [NSSavePanel savePanel];
int buttonPressed = [cocaoSavePanel runModal];
if (buttonPressed != NSOKButton)
{
return;
}
NSLog(@"ok button, with url: %@", [cocaoSavePanel URL]);
NSError *error;
NSData *plistData = [NSPropertyListSerialization dataWithPropertyList:cards
format:NSPropertyListXMLFormat_v1_0
options: 0
error: &error];
if (plistData)
{
[plistData writeToURL:[cocaoSavePanel URL] atomically:YES];
NSLog(@"File Saved Successfully");
}
else {
NSLog(@"%@", error);
}
}
任何帮助都将不胜感激
编辑:修订后:
2011-08-12 13:00:47.937 flashcards[14452:a0f] saveSet called
2011-08-12 13:00:48.763 flashcards[14452:a0f] ok button, with url: file://localhost/Users/sam/Desktop/asdf
2011-08-12 13:00:48.764 flashcards[14452:a0f] {
3 = {
back = friend;
front = "amicus/amici";
};
2 = {
back = "alliance, friendship";
front = "amicitia/amicitiae";
};
1 = {
back = "lifetime, age, generation";
front = "aetas/aetatis";
};
4 = {
back = "mind, heart, spirit, courage";
front = "animus/animi";
};
}
2011-08-12 13:00:48.764 flashcards[14452:a0f] Property list invalid for format: 100
Program received signal: “EXC_BAD_ACCESS”.
sharedlibrary apply-load-rules all
泄漏空的NSString
(或者,可能会,但是[[NSString alloc]init]
会同时返回一个单例)。此外,您正在泄漏放入外部卡中的所有词典
通常,当出现这种错误时,这是因为您的字典/数组中有一个不兼容plist的对象;不是NSNumber、NSArray、NSDate、NSData、NSString、NSDictionary等的内容
NSLog(@“%@”,卡片)代码>就在序列化之前,然后发布。另外,确切的plist序列化格式错误是什么
我只是复制/粘贴了你的代码,得到了:
asdfasdf[81731:707] Property list invalid for format (property list dictionaries may only have keys which are CFStrings, not 'CFNumber')
- 你不能有数字键
- 始终读取并发布运行时发出的全部错误消息
与您的问题无关,但不要这样做currentSide=[[NSString alloc]init]代码>稍后重新分配时,您只是在非垃圾收集环境中创建内存泄漏。错误对象告诉您什么?重要提示:此方法已过时,不久将被弃用。改用dataWithPropertyList:format:options:error:代替。---另一个方法还返回一个NSError对象,该对象可能包含跟踪问题的更多有用信息。friend不是一个字符串(请参阅上面的编辑),我不理解这一点,因为在定义字典时,它仍然是一个字符串。friend
;引号是可选的,不显示没有标点/空格的字符串。那么我看不出nsdictionary没有理由不序列化。对不起。我发布了我收到的所有错误消息,我非常困惑为什么它告诉了你而不是我。如果它告诉我,我一开始就不会把这个问题贴在这里。非常抱歉,谢谢你。别担心——我承认拥抱我的古怪裤子有点太大声了。如果您有时间,试着做一个简单的例子,看看它是否在桌面运行时工具项目和设备上产生错误消息。这可能是运行时行为的不同。一个抱怨缺少描述性错误消息的bug是有理由的。
asdfasdf[81731:707] Property list invalid for format (property list dictionaries may only have keys which are CFStrings, not 'CFNumber')