【问题标题】:isEqual doesn't always work for NSIndexPath? What can I use in its place?isEqual 并不总是适用于 NSIndexPath?我可以用什么代替它?
【发布时间】:2011-04-17 00:05:32
【问题描述】:

我有一些代码依赖于比较两个 NSIndexPath 并根据它们是否相等(使用 -isEqual)执行不同的代码。大多数时候它可以正常工作,但有时却不能。我在代码执行期间使用调试器控制台测试了两个索引路径,它们看起来和我一模一样。

代码如下:

- (BOOL)selectedStreetIsSameAsLastSelectedStreet
{
    return [self.indexPathOfSelectedStreet isEqual:self.previousObject.indexPathOfSelectedStreet];
}

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

(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'

我做错了什么,还是有其他方法可以可靠地测试两个 NSIndexPath 的相等性?

【问题讨论】:

    标签: objective-c equality iphone-sdk-3.2 nsindexpath


    【解决方案1】:

    从 iOS 5 开始,您可以只使用 isEqual:(参见 cmets)


    试试[indexPath1 compare: indexPath2] == NSOrderedSame

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

    【讨论】:

    • 完美。感谢您的快速回复!
    • 我倾向于认为这也可能是一个错误。我在 iOS 4.2 b3 中遇到了同样的问题。
    • 我相信这是因为-isEqual:只是在做两个索引路径的指针比较。
    • 从 iOS 5 开始,NSIndexPath 现在实现了 -isEqual: 方法来完成您所期望的工作。为了向后兼容,-compare: 替代方案是最佳选择。
    • @Cœur 在 iOS 5 之前,NSIndexPath 实例是唯一的;所以请求[1, 1] 的索引路径两次会给你相同的实例。这在 iOS 5 中发生了变化,因此需要比简单的指针比较更强大的相等性检查(实际上会检查索引是否相同,即使实例不同)。由于开发人员现在真的不需要过多担心 iOS 5 之前的设备,因此使用 isEqual: 是确定两个 NSIndexPaths 是否相等的正确方法。如果你必须支持 iOS ,你只需要-compare: 选项
    猜你喜欢
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    相关资源
    最近更新 更多