这行代码:
[mymutabledict setObject:myclassobj forKey:myclassobj.myidstring];
给出了这个错误:
*** - [NSCFString hash]:发送到解除分配的实例0x3c14610的消息
我在该行放置一个断点并且我已经检查了所有3个对象(mymutabledict,myclassobj和myclassobj.myidstring)在调试器中正确分配并可见且正确。还有什么可能导致此错误?这可能与我以前用于将之前的项目放入字典的对象或键有关吗?
我甚至检查过,所使用的密钥与之前输入的任何密钥都不匹配。
有一点额外信息:我正在将SQL数据库中的对象加载到内存中的可变字典中。几周以来,这些代码在几组样本数据上都运行良好,而今天这个代码就提出了一个特定的DB副本。谢谢!
答案 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)”以保持其引用有效。