iOS 5上的NSDictionary中的奇怪重复键,而iOS 6则不然

时间:2013-01-05 15:57:51

标签: iphone objective-c ios uitableview nsdictionary

我正在使用NSMutableDictionary来存储某些UITableViewCell的值,因此我使用NSIndexPath的实例作为键。一切都在iOS 6上按预期工作,但是当我在iOS 5模拟器中运行完全相同的代码时,会发生奇怪的事情。所以我将字典的内容打印到控制台:

Printing description of heights:
{
    "<UIMutableIndexPath 0x6a8a3d0> 2 indexes [1, 3]" = 100;
    "<UIMutableIndexPath 0x6a8a3d0> 2 indexes [1, 3]" = 100;
    "<UIMutableIndexPath 0x6a8a3d0> 2 indexes [1, 3]" = 100;
}

在iOS 6上,它看起来像这样:

Printing description of heights:
{
    "<UIMutableIndexPath 0x75ca8c0> 2 indexes [0, 1]" = 44;
    "<UIMutableIndexPath 0x75caa70> 2 indexes [0, 0]" = 10;
    "<UIMutableIndexPath 0x75ca500> 2 indexes [1, 0]" = 100;
    "<UIMutableIndexPath 0x717df70> 2 indexes [1, 1]" = 67;
    "<UIMutableIndexPath 0x715a3e0> 2 indexes [1, 2]" = 67;
    "<UIMutableIndexPath 0x717def0> 2 indexes [1, 3]" = 67;
}

显然应该是这样的!为什么iOS 5上的字典会为完全相同的密钥存储不同的值?


修改:部分代码......

字典创建只是

self.heights = [[NSMutableDictionary alloc] init];

我使用新的下标语法设置值,例如:

self.heights[indexPath] = minHeight;

indexPathNSIndexPathminHeightNSNumber。)

我在委托请求时动态设置这些值:

- (NSNumber *)heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (![indexPath isInTableView:self.tableView])
    {
        @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"indexPath not in tableView" userInfo:nil];
    }

    NSNumber *storedHeight = self.heights[indexPath];
    if (storedHeight != nil)
    {
        return storedHeight;
    }

    NSNumber *minHeight = self.minimumHeights[indexPath];
    self.heights[indexPath] = minHeight;
    return minHeight;
}

minimumHeights NSDictionary也为表格视图中的每个indexPath保留NSNumber

1 个答案:

答案 0 :(得分:3)

我记得在iOS6中阅读NSIndexPath方法isEqual:hash或两者都有变化,或者只是iOS 5中存在错误。无论如何,似乎你不能将它们用作字典键。

尝试使用不同的键。也许使用其description方法或使用section和row构建的自定义字符串。

#define idx2key(_ip) [NSString stringWithFormat:@"%d:%d", [_ip section], [_ip row]]

...
self.heights[idx2key(indexPath)] = minHeight;
...

在旧NSIndexPath Apple说:

  

NSIndexPath对象是唯一且共享的。如果是索引路径   包含指定的索引或索引已存在,该对象   返回而不是新实例。

该段落不再存在。我想实例的内部比较也已经改变了。