2011-12-05 50 views
0

我得到这个错误的OBJ-C,用于释放对象不正确的校验 - 对象是被释放

malloc: * * * error for object 0x8a591d4: incorrect checksum for freed object - object was probably modified after being freed. 
*** set a breakpoint in malloc_error_break to debug 
No memory available to program now: unsafe to call malloc 
No memory available to program now: unsafe to call malloc 

它来源于此行

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Info" 
     ofType:@"plist"]; 
NSData *plistData = [NSData dataWithContentsOfFile:plistPath]; 
NSDictionary *loadedPlist = 
[NSPropertyListSerialization propertyListFromData:plistData 
     mutabilityOption:0 format:NULL errorDescription:NULL]; <<< this line 

plistData的价值后可能被修改设置为摘要不可用

我不确定从哪里开始?

编辑 - 添加更多的代码

+0

至少发布引起错误的整个行。我的建议是,所有涉及该调用的代码,包括如何设置plistData。 – jer

+0

不知道这是否有帮助,但尝试传递参数'nil'而不是'NULL' - 我不记得它是否有所作为 – Daniel

回答

5

我将添加另一个答案:这也有可能是你已经在该区堆,和你在propertyListFromData上失败:仅仅因为它执行了大量的分配,碰巧碰到了不好的地方。因此,请在Xcode中编辑您的方案,并确保您已经检查了所有内存管理项目(在“运行”任务的“诊断”选项卡中)。

0

你有设置在malloc_error_break断点?这至少给你一个回溯,你可能会看到一些注意事项。如果没有别的,你可以从GDB控制台尝试po plistData

顺便说一句,虽然它可能没有帮助,我认为dictionaryWithContentsOfFile:会更简单。

0

Info.plist如何被存储?它是一个标准的plist/xml文件吗?以下问题是否可以解决您正在尝试解决的问题,并可能防止此问题的发生?

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Info" 
     ofType:@"plist"]; 
NSDictionary *loadedPlist = [[NSDictionary alloc] initWithContentsOfFile:plistPath]; 

或者,如果你想要一个自动释放的对象......

NSDictionary *loadedPlist = [NSDictionary dictionaryWithContentsOfFile:plistPath];