NSNumber返回的值不同于原始int

时间:2013-05-19 08:46:22

标签: objective-c

我对objective-c很新,我正在尝试将int转换为NSNumber,以便将其保存到Core-Data中。

我有以下代码(索引是NSInteger)

- (void) associateOrNotToARoutine:(NSString*)exerciseName associate:(BOOL)associate index:(NSInteger)index

NSLog(@"number w index %d, %d",[NSNumber numberWithInteger:index],index);

然后返回

number w index 170413600, 2

我需要一个2的int被翻译成2号以及所有其他数字被翻译成正确的数字......有谁能告诉我为什么我得到这个转换?我尝试阅读NSNumber手册,但我什么都没找到

3 个答案:

答案 0 :(得分:8)

尝试:

NSLog(@"number w index %@, %d",[NSNumber numberWithInteger:index],index);
                       ^^

%@格式说明符将调用[NSNumber description]方法,该方法应返回您之后的值。您的原始代码将返回NSNumber对象的地址,而不是其内容。

答案 1 :(得分:4)

尽管这个问题已经得到解答,但我认为我会为未来的读者充实更长的答案:

发生了什么事?
%dC format string,用于表示传递的参数之一是整数(int)ivar值。很像%f用于float值。

[NSNumber numberWithInteger:index]返回指向NSNumber实例的指针。如果你使用%d,NSLog会认为你传递了一个整数,实际上,你正在传递一个指针。所以打印指针值(内存地址)。

什么是%@
如trojanfoe所述:%@告诉NSLog()您正在传递一个对象。在这种情况下,NSLog要求对象使用字符串来描述自己...它调用description方法。

具体答案
对于这个具体问题,有多种方法。两个主要是:

  • NSLog(@"number w index %@, %d", [NSNumber numberWithInteger:index], index);
  • NSLog(@"number w index %d, %d", [[NSNumber numberWithInteger:index] intValue], index);

额外的善意
使用%@时,传递的对象可以是响应description的任何内容,基本上是NSObject的后代。另外,如果您正在创建自己的类,那么重载description以返回比默认NSObject实现更有意义的字符串是个好主意。

// Try using it with NSArray or NSDictionary and see how each describe themselves.
NSLog(@"the array description: %@", myArray);
NSLog(@"the dictionary description: %@", myDictionary);

答案 2 :(得分:2)

你应该使用,

[[NSNumber numberWithInteger:index] intValue] 

获取整数值,NSNumber,持有