使用#define变量创建NSNumber

时间:2013-11-04 03:56:23

标签: ios types 64-bit nsnumber type-conversion

根据我对NSNumber的理解,如果使用某种数据类型创建NSNumber,则需要使用相同的数据类型访问该变量。例如

NSNumber *myIntNumber = [NSNumber numberWithInt:1];
int myInt = [myIntNumber intValue];

NSNumber *myNSIntegerNumber = [NSNumber numberWithInteger:1];
NSInteger myInteger = [myIntNumber integerValue];

如果使用#define变量创建NSNumber:

#define MY_DEFINE 6

这是否意味着我无法执行以下操作

NSNumber *myNSIntegerNumber = [NSNumber numberWithInteger:MY_DEFINE];
NSInteger myInteger = [myIntNumber integerValue];

因为MY_DEFINE不是NSInteger?

我知道上面的代码可以在32位应用程序中运行,但我正在尝试确保它可以在64位应用程序上运行,这对于这些事情也更加挑剔。当然,做正确的事情绝对不会伤害。

如果我不能做到以上情况,我是否应该尝试以不同的方式定义MY_DEFINE,以便我可以使用它来创建一个NSNumber,以后可以用来检索NSInteger?

1 个答案:

答案 0 :(得分:5)

您对NSNumber的理解不正确。您可以使用它支持的任何类型创建NSNumber,然后您可以使用任何支持的类型访问器。两者不需要相同。

// Perfectly valid
NSNumber *number = [NSNumber numberWithFloat:3.14];
int val = [number intValue]; // results in 3

您对#define的使用完全有效。预编译器只是将您的代码转换为:

NSNumber *myNSIntegerNumber = [NSNumber numberWithInteger:6];

请记住,#define只不过是在编译代码之前完成的简单复制和粘贴(至少在这种简单形式中)。

您甚至可以使用现代语法:

NSNumber *number = @MY_DEFINE;

变为:

NSNumber *number = @6;
BTW - 为什么发布这个问题?为什么不先试试呢?