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

时间:2011-09-26 12:48:16

标签: objective-c comparison nsnumber

前几天我读过另一个用户写的关于NSNumber对象之间使用&lt; (更少)运营商..他得到了错误的结果,人们告诉他,它正在比较NSNumber对象的地址而不是他们的价值......我试图重现问题,但有些东西我不知道:< / p>

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;
}

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

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

我希望问题很清楚。提前感谢您的帮助。

1 个答案:

答案 0 :(得分:11)

  

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

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

在幕后发生的事情是,Lion使用tagged pointers代表整数的NSNumber个实例({1}}。由于标记指针表示,特定示例中的地址最终具有与它们所代表的基础整数相同的顺序。

如果使用

打印实际地址
printf("%p\n", [arrayDistance objectAtIndex:i]);

你会得到:

0xac3
0x14c3
0x8c3
0x9c3

忽略最不重要的字节:

0xa  = 10
0x14 = 20
0x8  = 8
0x9  = 9

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

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

  

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

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