如何让我的iPhone应用程序在64位和32位上运行?

时间:2013-11-06 00:30:51

标签: iphone objective-c xcode 64-bit 32bit-64bit

我尝试以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];
    }
}

3 个答案:

答案 0 :(得分:0)

如果您右键单击NSInteger,然后点击“转到定义”,您可以确切地看到它是#define的确切方式,并将其用作骨架来设置类似的#define %d / %ldNSInteger匹配。


#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)

请勿使用NSIntegerNSUInteger作为格式参数。而是投射它们(例如到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