当值等于时,为什么NSNumber指向相同的地址?

给出以下代码:

int firstInt, secondInt; firstInt = 5; secondInt = 5; NSNumber *firstNumber = [NSNumber numberWithInt:firstInt]; NSNumber *secondNumber = [NSNumber numberWithInt:secondInt]; 

为什么在地球上这两个NSNumber实例指向同一个地址?

这让我抓狂!

当然,如果你将secondInt更改为’4’,则所有工作都按预期工作。

谢谢,Jérémy

这可能是编译器优化或实现细节:因为NSNumber是不可变的,所以不需要它们是单独的实例。

编辑:可能是一个实现优化思考它。 随后使用相同的整数调用numberWithInt返回单例。

我的设计本能告诉我,如果分数的身份与其纯粹的价值不同,那么你应该排序某种分数对象而不是普通的NSNumbers。

除此之外:在紧要关头,你可以使用普通的NSValue,就像你使用NSNumber一样。 获取值是一个更多的工作,但NSValue本身没有NSNumber为小值做的实例合并行为。

一些代码可以执行所有三种行为:

  // NSValues are always distinct: int foo = 5, bar = 5, outfoo, outbar; NSValue *one = [NSValue value:&foo withObjCType:@encode(int)]; NSValue *two = [NSValue value:&bar withObjCType:@encode(int)]; [one getValue:&outfoo]; [two getValue:&outbar]; NSLog(@"one: %@ %x = %d ; two: %@ %x = %d", [one class], one, outfoo, [two class], two, outbar); // by comparison with NSNumber behavior: NSNumber *three = [NSNumber numberWithInt:6]; NSNumber *four = [NSNumber numberWithInt:6]; NSLog(@"three: %@ %x = %d ; four: %@ %x = %d", [three class], three, [three intValue], [four class], four, [four intValue]); // except when the numbers are big: NSNumber *five = [NSNumber numberWithInt:8675309]; NSNumber *six = [NSNumber numberWithInt:8675309]; NSLog(@"five: %@ %x = %d ; six: %@ %x = %d", [five class], five, [five intValue], [six class], six, [six intValue]); 

在我的Mac上,这产生如下输出:

 one: NSConcreteValue 42a8d0 = 5 ; two: NSConcreteValue 42a920 = 5 three: NSCFNumber 404380 = 6 ; four: NSCFNumber 404380 = 6 five: NSCFNumber 1324d0 = 8675309 ; six: NSCFNumber 106e00 = 8675309 

因为它们具有相同的hash值,所以NSNumber会从第一次分配中返回一个缓存的指针。

Interesting Posts