NSInteger的字符串格式化%ld建议(长)?

时间:2014-11-04 00:05:52

标签: objective-c nsinteger

当我将%d与NSInteger一起使用时,Xcode建议使用%ld并使用(long)强制转换NSInteger。但是当我只使用没有(长)myNSInteger的%ld时,警告消失了。

我应该使用哪个?

2 个答案:

答案 0 :(得分:1)

来自Apple的标题:

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

因此NSInteger的类型是int或long,具体取决于目标平台。当你不进行投射时,你没有得到警告,因为你(很可能)在64位平台上运行。如果您的目标是32位平台,您将收到一个没有演员阵容的警告。

你可以使用%zd,它总能在32位和64位平台上没有强制转换的情况下工作(但我认为只适用于有符号整数)。

你可以做这样的事情而不用担心它(但是性能受到影响):

NSInteger myNSInteger = 12345;
[NSString stringWithFormat:@"%@", @(myNSInteger)];

答案 1 :(得分:0)

取决于模拟器中的设备: 对于iPhone 5或更低版本,NSinteger是32位,%d是可以的,如果你使用%ld你应该使用(长)。 使用iPhone 5S或更高版本,NSInteger为64位,%ld即可。

没有任何警告的最佳选择是ld并全部施放(长)。