gpt4 book ai didi

objective-c - NSArray containsObject 没有像宣传的那样工作

转载 作者:搜寻专家 更新时间:2023-10-30 20:25:11 24 4
gpt4 key购买 nike

所以,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: 消息。

例如,我有两个类:FlxSortFlxFieldKey。一个 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;
}
}

意味着 testObjisEqual: 实现可以被缓存并直接调用,而不是通过 objc_msgSend() 发送消息时间。因为 NSArray 可以是异构的,所以如果比较是相反的,就不可能缓存每个调用,就像文档所说的那样。

那里有一个小的性能提升,可能适合大型数组。

您可能应该提交一个文档错误,尽管正如 Rob Napier 所指出的,这只是一个问题,如果您使平等不对称,这本身就是一个有问题的想法。

关于objective-c - NSArray containsObject 没有像宣传的那样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19575452/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com