NSMutableDictionary setobject给出“消息发送到解除分配的实例”错误

时间:2009-12-18 03:46:55

标签: iphone objective-c cocoa-touch dictionary

这行代码: [mymutabledict setObject:myclassobj forKey:myclassobj.myidstring];

给出了这个错误:

  

*** - [NSCFString hash]:发送到解除分配的实例0x3c14610的消息

我在该行放置一个断点并且我已经检查了所有3个对象(mymutabledict,myclassobj和myclassobj.myidstring)在调试器中正确分配并可见且正确。还有什么可能导致此错误?这可能与我以前用于将之前的项目放入字典的对象或键有关吗?

我甚至检查过,所使用的密钥与之前输入的任何密钥都不匹配。

有一点额外信息:我正在将SQL数据库中的对象加载到内存中的可变字典中。几周以来,这些代码在几组样本数据上都运行良好,而今天这个代码就提出了一个特定的DB副本。谢谢!

3 个答案:

答案 0 :(得分:3)

你似乎在某事上多次调用release。在该行上方添加以下代码:

for (NSString *key in mymutabledict) {
    NSLog(@"Key %@ maps to %@.", key, [mymutabledict objectForKey:key]);
}
NSLog(@"About to add %@", myclassobj);
NSLog(@"   with key %@", myclassobj.myname);

...并寻找崩溃的物体。

将对象添加到NSDictionary / NSMutableDicitonary对象时,会复制密钥,而不是保留密钥。如果您从字典中提取密钥并释放它们(例如,在上面的代码中调用[key release]或通过[mymutabledict allKeys]获取的字符串对象),那可能会这样做。

答案 1 :(得分:1)

使用NSZombieEnabled运行您的程序。当保留计数达到0时,NSZombieEnabled将对象的类型(在您的情况下为NSMutableDictionary)更改为NSZombie对象。每当向此zombie对象发送消息时,程序立即崩溃,使您可以准确查看问题发生的位置

答案 2 :(得分:1)

如何定义“myidstring”属性?由于它是NSString,因此您已将其声明为“@property(retain)”以保持其引用有效。