我尝试以64位模式运行时得到的确切错误是Format specifies type 'int' but the argument has type 'long'
。
我可以通过将%d
更改为%ld
来修复此错误,但是当我以32位(正常)模式运行应用时,我收到错误消息:Format specifies type 'long' but the argument has type 'int'
如何计算64位和32位?我创建了if(条件)吗?
- (void)pickerView:(UIPickerView *)pickerView didSelectRow: (NSInteger)row inComponent:(NSInteger)component {
// Handle the selection
if(pickerView.tag == 1){
start = row+1;
[startButton setTitle:[NSString stringWithFormat:@"%d. %@", row+1, [stops objectForKey:[NSString stringWithFormat:@"%d", row+1]]] forState:UIControlStateNormal];
}else if (pickerView.tag == 2){
stop = row+1;
[endButton setTitle:[NSString stringWithFormat:@"%d. %@", row+1, [stops objectForKey:[NSString stringWithFormat:@"%d", row+1]]] forState:UIControlStateNormal];
}
}
答案 0 :(得分:0)
如果您右键单击NSInteger
,然后点击“转到定义”,您可以确切地看到它是#define
的确切方式,并将其用作骨架来设置类似的#define
%d
/ %ld
与NSInteger
匹配。
#if __LP64__
typedef long NSInteger;
#else
typedef int NSInteger;
#endif
这就是NSInteger
的工作原理。你可以做类似的事情:
#if __LP64__
#define FS_NSInt ld
#else
#define FS_NSInt d
#endif
然后只使用FS_NSInt
作为NSInteger
s的格式规范。 (在{前面放一个%
)
答案 1 :(得分:0)
请勿使用NSInteger
或NSUInteger
作为格式参数。而是投射它们(例如到long long
:
[NSString stringWithFormat:@"%lld", (long long)row+1]
答案 2 :(得分:0)
来自Apple docs:
类型说明符:
通常,在32位代码中,您使用%d说明符来格式化int 函数中的值> as printf,NSAssert和NSLog,以及 stringWithFormat等方法。但是使用NSInteger,它在64位上 架构的大小与长度相同,需要使用%ld 符。除非你像64位那样构建32位,否则这些 说明符以32位模式生成编译器警告。为了避免这种情况 问题,您可以将值转换为long或unsigned long,如 适当。例如:
NSInteger i = 34;
printf("%ld\n", (long)i);
解决这个问题的一种方法是使用stdint.h中的类型:
int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t