当我为我的iOS应用程序的代码编译arm64时,我遇到了一个有趣的问题,涉及自定义Foundation类型的不同基本类型。比如说,我想要printf(或stringWithFormat)一个声明为NSUInteger的数字。
[NSString stringWithFormat:@"%u", _depth,
这将在编译arm64时产生警告,因为在arm64中,NSUInteger被声明为unsigned long。因此,我应该用"%lu"替换"%u",但是当编译32位架构(armv7)时,这种方法变得无效,因为在32位架构中,NSUInteger被声明为unsigned int。 我知道警告说"不应使用NSUInteger作为格式参数",那么我们继续看浮点数:
typedef CGFLOAT_TYPE CGFloat;
在64位系统上,CGFLOAT_TYPE 是 double,而在32位系统上则是 float。因此,进行以下操作:
- (void)foo:(CGFloat)value;
然后
[self foo:10.0f];
[self foo:10.0];
在编译两个体系结构时,仍会产生警告。在32位架构上,第二次调用不正确(从double转换为float),在64位架构上,第一个将float转换为double(这是可以的,但仍然不好)。
很想听听您对这个问题的想法。
[self foo:10.0f]
的警告吗?即使使用-Weverything
,我也无法复现。 - Martin R