Ios 使用#define变量创建NSNumber

Ios 使用#define变量创建NSNumber,ios,types,64-bit,nsnumber,type-conversion,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 integ

根据我对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];
因为我的定义不是一个NSInteger

我知道上面的代码可以在32位应用程序中使用,但我正在努力确保它可以在64位应用程序中使用,而64位应用程序对这些东西也非常挑剔。当然,把事情做好从来都没有坏处


如果我不能执行上述操作,我是否应该尝试以不同的方式定义我的_define,以便我可以使用它创建一个NSNumber,以后可以用于检索NSInteger?

您对
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;

顺便说一句,为什么要发布这个问题?为什么不先试一试呢?

我没有64位设备可以试一试(正在准备一台)。我的代码在模拟器中运行得很好,但是64位转换指南说它确实应该在64位设备上测试,所以我正在尽可能地准备我的代码。我总是像你刚才解释的那样接近NSInteger,但64位转换指南的这一部分让我停顿了一下:“Cocoa Touch中常见的类型转换问题。可可触觉,特别是核心基础和基础,增加了寻找的额外情况,因为它们提供了序列化C数据类型或在Objtovi-C对象中捕获它的方法。NSInteger更改64位代码中的大小。NSInteger类型在整个Cocoa Touch中使用;它在32位运行时是32位整数,在64位运行时是64位整数。因此,当从采用NSInteger类型的框架方法接收信息时,请使用NSInteger类型保存结果。尽管您永远不应该假设NSInteger类型的大小与int类型的大小相同,但这里有几个关键的示例需要寻找:转换为NSNumber对象或从NSNumber对象转换为NSNumber对象。。。“对不起,剪贴的时间太长了。看来我只是错误地解释了上述陈述?非常感谢你的帮助!