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

Iphone NSMutableDictionary setobject给出“消息已发送到解除分配的实例”错误,iphone,objective-c,cocoa-touch,dictionary,Iphone,Objective C,Cocoa Touch,Dictionary,这行代码: [mymutabledict setObject:myclassobj forKey:myclassobj.myidstring] 正在给出此错误: ***-[NSCFString hash]:发送到解除分配实例0x3c14610的消息 我在那一行输入了一个断点,我已经检查过了,所有3个对象mymutabledict、myclassobj和myclassobj.myidstring都被正确分配,并且在调试器中正确可见。还有什么可能导致此错误?这可能与我用来将以前的项目放入字典的对象或

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

正在给出此错误:

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

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

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

关于一点额外信息:我正在将对象从SQL数据库加载到内存中的可变字典中。这段代码在几周的时间里对几组样本数据都很好地工作,就在今天,它提供了一个特定的DB副本。谢谢

您似乎在某些事情上多次调用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/NSMutableDictionary对象时,会复制而不是保留键。如果您正在从字典中提取密钥并释放它们,例如,在上述代码中调用[key release],或者在通过[mymutabledict allKeys]获取的字符串对象上调用[key release],则可能会这样做。

您似乎在某些事情上调用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/NSMutableDictionary对象时,会复制而不是保留键。如果您正在从字典中提取密钥并释放它们,例如,在上述代码中调用[key release],或在通过[mymutabledict allKeys]获取的字符串对象上调用[key release],则可能会这样做。

使用运行程序。当保留计数达到0时,NSZombieEnabled会将您案例中的对象类型NSMutableDictionary更改为NSZombie对象。每当有消息发送到此僵尸对象时,程序立即崩溃,使您能够准确地看到问题发生的位置。

使用运行程序。当保留计数达到0时,NSZombieEnabled会将您案例中的对象类型NSMutableDictionary更改为NSZombie对象。每当向此僵尸对象发送消息时,程序立即崩溃,使您能够准确地看到问题发生的位置。

如何定义myidstring属性?由于它是一个NSString,您已将其声明为@propertyretain以保持其引用有效。

如何定义myidstring属性?因为它是一个字符串,您已将其声明为@propertyretain以保持其引用的有效性。

地址0x3c14610是否对应于这三个对象中的任何一个?否。抱歉,我忘了提及我检查了它,它并没有对应于这三个对象中的任何一个。对于其他对象,此DB副本的唯一性是什么?它大一点吗?包含重复项?绝对不比其他项大。查看后,我能找到的唯一一件事是,它确实包含一个密钥副本,一个将要使用的随机生成的ID字符串。地址0x3c14610是否对应于这三个对象中的任何一个?不。对不起,我忘了提到我检查了它,它并没有对应于这三个对象中的任何一个。这有什么独特之处数据库副本,其他数据库不正确?它大一点吗?包含重复项?绝对不比其他项大。查看后,我能找到的唯一一件事是,它确实包含一个密钥副本,一个将要使用的随机生成的ID字符串。按照链接了解如何找出在过度扩展时调用哪个方法。这将帮助您确定您的工作目标。按照链接了解如何找出在过度扩展时调用哪个方法。这将有助于你确定你的努力目标。我认为这是通向答案的方向。使用您的代码,我注意到在尝试将ID重复的项添加到字典时会出现问题。现在,在尝试将新对象存储到字典中之前,我必须找到一种方法来检查字典在该键处是否有内容……就是这样。我最终做的是创建一个可变数组,并存储我用于键的所有值,以确保我没有将多个对象分配给同一个键。它似乎已经解决了这个问题,但我不知道为什么。我认为这是通向答案的方向。使用您的代码,我注意到在尝试将ID重复的项添加到字典时会出现问题。现在,在尝试将新对象存储到字典中之前,我必须找到一种方法来检查字典在该键处是否有内容……就是这样。我最终做的是创建一个可变数组,并存储我用于键的所有值,以确保我没有将多个对象分配给同一个键。看来哈 我已经解决了这个问题,但我不知道为什么。