6

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

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

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

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

#define MY_DEFINE 6

这是否意味着我不能执行以下操作

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

因为 MY_DEFINE 不是 NSInteger?

我知道上面的代码可以在 32 位应用程序中运行,但我正在努力确保它可以在 64 位应用程序上运行,这对这些东西也更加挑剔。当然,正确地做事永远不会有坏处。

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

4

1 回答 1

10

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

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

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

NSNumber *myNSIntegerNumber = [NSNumber numberWithInteger:6];

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

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

NSNumber *number = @MY_DEFINE;

变成:

NSNumber *number = @6;

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

于 2013-11-04T04:09:38.850 回答