为什么NSInteger在32位iOS上定义为长?

时间:2014-05-21 08:07:19

标签: ios objective-c

NSInteger以这种方式定义:

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
#else
typedef int NSInteger;
#endif

这导致NSInteger被定义为32位iOS上的int,即使int和long仍然相同(均为4个字节)。如下所示的格式字符串会生成带有此定义的警告:

NSInteger x = 4;
[NSString stringWithFormat: @"%ld", x];

// Warning: Values of type 'NSInteger' should not be used as format arguments;
// add an explicit cast to 'long' instead.

有人知道为什么NSInteger并不总是被定义为长?

1 个答案:

答案 0 :(得分:4)

历史原因,以前使用的API版本int - 然后被迁移到使用typedef NSInteger ca. OS X的64位转换。

我认为他们可能已经针对iOS进行了更改,但如果它们在OS X和iOS上有所不同,那么会影响很多现有的和待开发的代码。