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中没有运算符重载.