isEqual并不总是适用于NSIndexPath?我可以用它来代替什么?

JoB*_*324 32 equality objective-c nsindexpath iphone-sdk-3.2

我有一些代码依赖于比较两个NSIndexPaths并根据它们的相等或缺乏来执行不同的代码(使用-isEqual).大部分时间它都能正常工作,但有时则不然.我已经使用调试器控制台在代码执行期间测试两个索引路径,它们看起来与我相同.

这是代码:

- (BOOL)selectedStreetIsSameAsLastSelectedStreet
{
    return [self.indexPathOfSelectedStreet isEqual:self.previousObject.indexPathOfSelectedStreet];
}
Run Code Online (Sandbox Code Playgroud)

这是执行代码期间的输出:

(gdb) po self.indexPathOfSelectedStreet
<NSIndexPath 0x60a0770> 2 indexes [26, 1]
(gdb) po self.previousObject.indexPathOfSelectedStreet
<NSIndexPath 0x55b4f70> 2 indexes [26, 1]
(gdb) p (BOOL)[self.indexPathOfSelectedStreet isEqual:self.previousObject.indexPathOfSelectedStreet]
$2 = 0 '\000'
Run Code Online (Sandbox Code Playgroud)

我做错了什么,还是有另一种方法可以可靠地测试两个NSIndexPaths的相等性?

Sve*_*ven 63

从iOS 5开始,你可以使用isEqual:(见评论)


试试[indexPath1 compare: indexPath2] == NSOrderedSame.

也许你发现了一个bug NSIndexPath.如果您尝试NSIndexPath使用已存在的路径创建新的,则应该获取该路径.所以isEqual:可能只是比较指针而不是存储的实际索引.

  • 从iOS 5开始,`NSIndexPath`现在实现了一个`-isEqual:`方法来做你期望的事情.为了向后兼容,`-compare:`替代方案是最佳选择. (41认同)
  • @Cœur在iOS 5之前,`NSIndexPath`实例是唯一的; 所以请求两次"[1,1]"的索引路径会给你*同一个实例*两次.这在iOS 5中发生了变化,因此比简单的指针比较(实际检查索引是相同的,即使实例不同)也需要更强的等式检查.由于开发人员现在并不需要过多担心iOS 5之前的设备,使用`isEqual:`是确定两个`NSIndexPaths`是否相等的正确方法.如果你必须支持iOS <5,你只需要`-compare:`选项. (5认同)
  • 我倾向于认为这也可能是一个错误.我在iOS 4.2 b3中遇到了同样的问题. (2认同)