前几天我读过另一个用户写的关于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)运算符为了比较存储在对象中的实际值?如果是这样,它在参考文档中写在哪里?
我希望问题很清楚。提前感谢您的帮助。
答案 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中没有运算符重载。