iOS - NSArray indexOfObject 不调用自定义的 isEqual

标签 ios objective-c

我有一个重写 isEqual 方法的人员类:

#import "People.h"

@implementation People
@synthesize name = _name;


-(BOOL)isEqual:(id)object {
    NSLog(@"A.isEqual called");

    if ([object isKindOfClass:[NSString class]]) {
        NSString *name = object;
        return [self.name isEqualToString:name];
    }
    return [super isEqual:object];
}

@end

当我在数组中找到人时,它不会调用 isEqual 方法:

People* p1 = [People new];
        p1.name = @"A";

        People* p2 = [People new];
        p2.name = @"B";

        NSArray* peopleArray = [NSArray arrayWithObjects:p1, p2, nil];

        NSLog(@"find A %ld", [peopleArray indexOfObject:@"A"]);

        NSLog(@"isEqual A -> %@", [p1 isEqual:@"A"] ? @"Yes" : @"No");

这是输出:

2013-04-10 18:15:47.988 runone[6273:303] find A 9223372036854775807
2013-04-10 18:15:47.988 runone[6273:303] A.isEqual called
2013-04-10 18:15:47.989 runone[6273:303] isEqual A -> Yes

你知道这是为什么吗?

最佳答案

尽管 Apple 的文档 says isEqual: 被发送到数组中的每个对象,它以相反的方式执行 - 发送 isEqual: 到您正在搜索的对象。

由于假定 [a isEqual:b] == [b isEqual:a],因此在大多数情况下它应该没有任何区别,但在您的情况下却有区别。

这是一个例子:

People* p1 = [People new];
p1.name = @"A";

People* p2 = [People new];
p2.name = @"B";

People* p3 = [People new];
p3.name = @"C";

NSArray* peopleArray = [NSArray arrayWithObjects:p1, p2, p3, nil];

NSLog(@"find A %ld", (unsigned long)[peopleArray indexOfObject:p3]);

在 People 的 isEqual 方法中:

-(BOOL)isEqual:(id)object
{
    NSLog(@"A.isEqual called %@", [self name]);
    ...
}

输出:

A.isEqual called C
A.isEqual called C
find A 2

关于iOS - NSArray indexOfObject 不调用自定义的 isEqual,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15924368/

相关文章:

iphone - xcode - 安排时间的本地通知(每天早上 6 点)

objective-c - 简单但动态生成的 iOS 流程图或流程图 View

html - 显示 :inline-grid doesn't support on very fresh safari

iOS UI 测试 - 无法找到 UILabel *with* accessibilityIdentifier

ios - 在iOS中无法播放声音

ios - 避免 AppDelegate 中出现 "uncaughtExceptionHandler"警告

ios - 哪些 iOS 设备支持区域监控?

ios - swift - ManagedObjectContext 中的 CoreData 为零

php上传数据到mysql服务器

ios - NSArray 排序数组使用描述符 : New Copy or Retain?