Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSMutableDictionary中的对象突然变为null_Ios_Objective C_Automatic Ref Counting - Fatal编程技术网

Ios NSMutableDictionary中的对象突然变为null

Ios NSMutableDictionary中的对象突然变为null,ios,objective-c,automatic-ref-counting,Ios,Objective C,Automatic Ref Counting,更新: 我添加了一个方法来检查字典中的空对象,事实上,它们被找到了: 有人见过这样的事吗?这不能由不正确的内存管理引起。请注意,左侧的dictionary对象树实际上是正确的 结束更新 我在启用ARC的情况下向NSMutableDictionary添加了许多条目。在一次添加之后,添加的对象突然变为空。下面是我扩展它以确保我没有发疯的代码: NSMutableDictionary *base = [NSMutableDictionary dictionary]; id o = [GAConsta

更新:

我添加了一个方法来检查字典中的空对象,事实上,它们被找到了:

有人见过这样的事吗?这不能由不正确的内存管理引起。请注意,左侧的dictionary对象树实际上是正确的

结束更新

我在启用ARC的情况下向NSMutableDictionary添加了许多条目。在一次添加之后,添加的对象突然变为空。下面是我扩展它以确保我没有发疯的代码:

NSMutableDictionary *base = [NSMutableDictionary dictionary];

id o = [GAConstant kTRUE];
id k = [GAClause parse:@"(x 1 1)"];
[base setObject:o forKey:k];
NSLog(@"### Added (%@ -> %@): %@", k, o, base);

o = [GAClause parse:@"(y X)"];
k = [GAClause parse:@"(x 2 X)"];
[base setObject:o forKey:k];
NSLog(@"### Added (%@ -> %@): %@", k, o, base);

o = [GAConstant kTRUE];
k = [GAClause parse:@"(y 3)"];
[base setObject:o forKey:k];
NSLog(@"### Added (%@ -> %@): %@", k, o, base);

o = [GAConstant kTRUE];
k = [GAClause parse:@"(y 6)"];
[base setObject:o forKey:k];
NSLog(@"### Added (%@ -> %@): %@", k, o, base);
以下是输出:

2013-03-25 16:10:33.546 Jungle[1978:11303] ### Added (<GAListClause: 0x75b0dc0> -> <GAConstant: 0x75b12b0>): {
    "<GAListClause: 0x75b1b00>" = "<GAConstant: 0x75b12b0>";
}
2013-03-25 16:10:33.548 Jungle[1978:11303] ### Added (<GAListClause: 0x75b2870> -> <GAListClause: 0x75b1aa0>): {
    "<GAListClause: 0x75b2270>" = "<GAListClause: 0x75b1aa0>";
    "<GAListClause: 0x75b1b00>" = "<GAConstant: 0x75b12b0>";
}
2013-03-25 16:10:33.549 Jungle[1978:11303] ### Added (<GAListClause: 0x75b2b90> -> <GAConstant: 0x75b12b0>): {
    "<GAListClause: 0x75b2d80>" = "<GAConstant: 0x75b12b0>";
    "<GAListClause: 0x75b2270>" = "<GAListClause: 0x75b1aa0>";
    "<GAListClause: 0x75b1b00>" = "<GAConstant: 0x75b12b0>";
}
2013-03-25 16:10:33.550 Jungle[1978:11303] ### Added (<GAListClause: 0x75b2f00> -> <GAConstant: 0x75b12b0>): {
    "<GAListClause: 0x75b2d80>" = "<GAConstant: 0x75b12b0>";
    "<GAListClause: 0x75b2270>" = "<GAListClause: 0x75b1aa0>";
    "<GAListClause: 0x75b1b00>" = "<GAConstant: 0x75b12b0>";
    "<GAListClause: 0x75b1d60>" = (null);
}
有时null在字典中波动:

2013-03-25 17:09:16.426 Jungle[2294:11303] ### Added (<GAListClause: 0x7182ce0> -> <GAConstant: 0x7183430>): {
    "<GAListClause: 0x7183a30>" = "<GAConstant: 0x7183430>";
}
2013-03-25 17:09:16.428 Jungle[2294:11303] ### Added (<GAListClause: 0x75467b0> -> <GAListClause: 0x71839d0>): {
    "<GAListClause: 0x7546a30>" = (null);
    "<GAListClause: 0x7183a30>" = "<GAConstant: 0x7183430>";
}
2013-03-25 17:09:16.429 Jungle[2294:11303] ### Added (<GAListClause: 0x7546cd0> -> <GAConstant: 0x7183430>): {
    "<GAListClause: 0x7546ec0>" = "<GAConstant: 0x7183430>";
    "<GAListClause: 0x7546a30>" = "<GAListClause: 0x71839d0>";
    "<GAListClause: 0x7183a30>" = "<GAConstant: 0x7183430>";
}
2013-03-25 17:09:16.430 Jungle[2294:11303] ### Added (<GAListClause: 0x7547040> -> <GAConstant: 0x7183430>): {
    "<GAListClause: 0x75470f0>" = (null);
    "<GAListClause: 0x7546ec0>" = "<GAConstant: 0x7183430>";
    "<GAListClause: 0x7546a30>" = "<GAListClause: 0x71839d0>";
    "<GAListClause: 0x7183a30>" = "<GAConstant: 0x7183430>";
}
以下是调试器中的外观:


你的问题很奇怪。总之,调试器将字典显示为正确,但objectForKey返回nil

我在过去的一个小时里一直在思考这个问题,我非常确定我只知道一种可能的情况——不正确的散列或等质量:方法

特别是,我认为isEqual:方法是不对称的。换句话说,如果我们有

id k = [GAClause parse:@"(x 1 1)"];
然后

不一定是真的

然后,如果获取字典键并尝试查找与[NSDictionary description]相同的值,则找不到这些值

我认为您应该将断点/NSLog放入isEqual,并观察比较值时发生的情况


还请注意,字典键是复制的,因此复制过程中可能会出现相等问题。

您的问题非常奇怪。总之,调试器将字典显示为正确,但objectForKey返回nil

我在过去的一个小时里一直在思考这个问题,我非常确定我只知道一种可能的情况——不正确的散列或等质量:方法

特别是,我认为isEqual:方法是不对称的。换句话说,如果我们有

id k = [GAClause parse:@"(x 1 1)"];
然后

不一定是真的

然后,如果获取字典键并尝试查找与[NSDictionary description]相同的值,则找不到这些值

我认为您应该将断点/NSLog放入isEqual,并观察比较值时发生的情况


还请注意,字典键是复制的,因此复制过程中可能会出现相等问题。

只是猜测一下,请使用[base setObject:[o copy]forKey:[k copy]]@AnoopVaidya这不是我要寻找的行为-我想存储原件,而不是复制正确保存到静态变量的[GAConstant kTRUE]?也就是说,作为一个强有力的参考?我怀疑您字典中的无效值实际上是[NSNull]。您的代码中是否有实际使用NSNull的地方?也许发生了碰撞?GAClause上的[NSObject hash]和[NSObject isEqual:]是否正确实现?请显示kTRUE方法的代码。静态变量是导致竞争条件的常见原因。还要检查您是否正在为所有对象调用init。只是猜测一下,请使用[base setObject:[o copy]forKey:[k copy]]@AnoopVaidya这不是我要寻找的行为-我想存储原件,而不是复制正确保存到静态变量的[GAConstant kTRUE]?也就是说,作为一个强有力的参考?我怀疑您字典中的无效值实际上是[NSNull]。您的代码中是否有实际使用NSNull的地方?也许发生了碰撞?GAClause上的[NSObject hash]和[NSObject isEqual:]是否正确实现?请显示kTRUE方法的代码。静态变量是竞争条件的常见原因。请检查您是否正在为所有对象调用init。请注意,字典键已被复制,因此在复制过程中可能会出现相等问题—事实正是如此。我查看了isEqual:和copyWithZone:实现,发现它们提供的结果不一致。请注意,字典键是复制的,因此在复制过程中可能会出现相等问题—事实就是如此。我查看了isEqual:和copyWithZone:实现,发现它们提供的结果不一致,原因如下:
[k isEqual:k]