NSNumber与<(less)运算符的比较而不是比较

Gia*_*nzi 3 comparison objective-c nsnumber

几天前我读过另一个用户写的关于使用<(less)运算符对NSNumber对象进行比较的帖子.他得到了错误的结果,人们告诉他,它正在比较NSNumber对象的地址而不是它们的值...我试图重现这个问题,但有些东西我不知道了:

int main (int argc, char*argv[])
{
        NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
        NSMutableArray *arrayDistance = [NSMutableArray array];

        [arrayDistance addObject:
                [NSNumber numberWithInteger: 10]];
        [arrayDistance addObject:
                [NSNumber numberWithInteger: 20]];
        [arrayDistance addObject:
                [NSNumber numberWithInteger: 8]];
        [arrayDistance addObject:
                [NSNumber numberWithInteger: 9]];

        int iMinor = 0;
        int i;
        for (i = 0; i < [arrayDistance count]; i++) {
                if([arrayDistance objectAtIndex: i] < [arrayDistance objectAtIndex: iMinor])
                {
                        iMinor = i;
                }
        }

        NSLog(@"iMinor is %d", iMinor);

        [pool release];

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码正确返回2,为什么?不应该比较地址而不是比较arrayDistance数组中NSNumber对象的值吗?是否有必要从NSNumber对象中获取整数值或使用NSNumber对象的compare方法?

NSNumber类是否重载<(less)运算符以便比较存储在对象中的实际值?如果是这样,它在参考文档中写在哪里?

我希望这个问题很清楚.预先感谢您的任何帮助.

小智 11

上面的代码正确返回2,为什么?不应该比较地址而不是比较arrayDistance数组中NSNumber对象的值吗?是否有必要从NSNumber对象中获取整数值或使用NSNumber对象的compare方法?

它正在比较的地址NSNumber objects,是的,您应该获得基础整数值或使用-compare:.

在幕后发生的事情是Lion使用标记指针NSNumber代表整数的(一部分)实例.由于标记指针表示,特定示例中的地址最终与它们表示的基础整数具有相同的顺序.

如果您打印实际地址

printf("%p\n", [arrayDistance objectAtIndex:i]);
Run Code Online (Sandbox Code Playgroud)

你会得到:

0xac3
0x14c3
0x8c3
0x9c3
Run Code Online (Sandbox Code Playgroud)

忽略最低有效字节:

0xa  = 10
0x14 = 20
0x8  = 8
0x9  = 9
Run Code Online (Sandbox Code Playgroud)

如您所见,这些地址确实映射了基础整数值.

但请注意,这是一个实现细节,根据目标平台的不同而不同,将来可能会发生变化.你不应该依赖它.

NSNumber类是否重载<(less)运算符以便比较存储在对象中的实际值?如果是这样,它在参考文档中写在哪里?

不,Objective-C中没有运算符重载.