当我将%d与NSInteger一起使用时,Xcode建议使用%ld并使用(long)强制转换NSInteger。但是当我只使用没有(长)myNSInteger的%ld时,警告消失了。
我应该使用哪个?
答案 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并全部施放(长)。