- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
所以,Apple 的文档是这样描述containsObject
的:
This method determines whether anObject is present in the array by sending an isEqual: message to each of the array’s objects (and passing anObject as the parameter to each isEqual: message).
您可以找到这些文档 here .
但是,我遇到的效果几乎完全相反。我提供的对象不是向数组中的每个对象发送 isEqual:
,而是为数组中的每个对象发送 isEqual:
消息。
例如,我有两个类:FlxSort
和FlxFieldKey
。一个 FlxSort
类包含一个字段键,我已经重写了 isEqual:
以在它传递一个与该键匹配的 FlxFieldKey
对象时返回 true它拥有。这在理论上应该允许我检查数组中是否存在具有特定键的 FlxSort
对象。但是,FlxFieldKey
不会(也不应该)知道 FlxSort
对象,因此如果提供了 FlxSort
,它将始终返回 false > 对象在其 isEqual
消息中。因此,在下面的代码中,我希望 currentSorts
中的每个对象都针对 _avialableKeys
中的每个键发送 isEqual:
消息。相反,_availableKeys
中的每个键都会发送 isEqual:
消息。我已经用日志记录和断点检查了这一点。
NSMutableArray *keys = [NSMutableArray arrayWithCapacity:_avialableKeys.count];
NSArray *currentSorts = _sortGroup.sorts;
for (FlxFieldKey *key in _avialableKeys){
if (![currentSorts containsObject:key]){
[keys addObject:key];
}
}
我是不是漏掉了什么?
更新
即使我问的是 [NSArray containsObject:]
,我也收到了很多关于我的非对称平等实现的反馈。所以我想澄清一下,我的实现是一个出于好奇而诞生的实验。原始代码根本没有使用containsObject
:
NSMutableArray *keys = [NSMutableArray arrayWithCapacity:_avialableKeys.count];
NSArray *currentSorts = _sortGroup.sorts;
for (FlxFieldKey *key in _avialableKeys){
BOOL found = NO;
for (FlxSort *sort in currentSorts){
if ([sort.key isEqual:key]){
found = YES;
break;
}
}
if (!found){
[keys addObject:key];
}
}
我很好奇我是否可以操纵 containsObject
在上述情况下工作。当然,正如一些人所指出的那样,创造不对称的平等是一个坏主意,并且直接违背了 Apple 的建议。我可以更改FlxFieldKey
中的isEqual:
方法以考虑FlxSort
对象,这将恢复对称相等在两个类(class)之间……有点。您仍然可能以 A == B、A == C,但 B != C 结束。这仍然存在 hash
问题(它们必须相同)。
让我重申:你不想这样做(不对称平等)。至少,不是在生产代码中。我只是在这里闲逛,看看我可以 做什么,而不是我应该 做什么。我承认在最初的问题中没有澄清这一点对我来说是不负责任的,因为经验不足的开发人员可能认为这种实现是可以做到的。对此我深表歉意。
是的,一旦我鼓起勇气再次进入 Apple 的错误报告程序,我可能会在 Radar 中报告一个文档错误...
最佳答案
我不知道这是实际发生的事情,但是将 containsObject:
实现为(松散地):
for( id containedObj in self ){
if( [testObj isEqual:containedObj] ){
return YES;
}
}
意味着 testObj
的 isEqual:
实现可以被缓存并直接调用,而不是通过 objc_msgSend()
发送消息时间。因为 NSArray
可以是异构的,所以如果比较是相反的,就不可能缓存每个调用,就像文档所说的那样。
那里有一个小的性能提升,可能适合大型数组。
您可能应该提交一个文档错误,尽管正如 Rob Napier 所指出的,这只是一个问题,如果您使平等不对称,这本身就是一个有问题的想法。
关于objective-c - NSArray containsObject 没有像宣传的那样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19575452/
Possible duplicates Is there a reason to not use Boost? What are the advantages of using the C++ BOO
任何人都可以推荐任何关于 jQuery 的特别引人注目的宣传(论文,甚至更好,视频),适合对技术知之甚少的经理吗? 我的经理似乎非常不愿意考虑让我们使用它,似乎认为这是本月的另一种技术风格/昙花一现。
URL 框架规范:https://github.com/google/eddystone/tree/master/eddystone-url 我在宣传 Eddystone URL 框架时遇到问题。我正
我是一名优秀的程序员,十分优秀!