ios学习之路(知识点)Values of type 'NSInteger' should not be used as format arguments...


在使用format arguments的时候,遇到了如题的编译器 warning, 当然Xcode也提供了Fix-it来解决。但作为一个合格的程序者,原理是一定要去探个究竟的,起码这点好奇心如果都没有,那在工作的路上一定会跪掉的。

不废话了,简单如下的demo,就可以重现这个问题。

NSInteger number = 5;
NSLog(@"%d", number);
[NSString stringWithFormat:@"%d", number];

果断去了SO查看,得到解答,跟度娘上所有的答案都很一致 (但是仍不能解决我的疑问)

http://stackoverflow.com/questions/16075559/why-does-an-nsinteger-variable-have-to-typecasted-to-type-long


首先来看NSInteger的定义(如下),在64位系统中NSInteger是long, 32位中是int。所以"%d"在64位上当然是不足以够位长,这里修改为"%ld"合情合理。

#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

然后Xcode Fix-it推荐做法是下面这样。

[NSString stringWithFormat:@"%ld", (long)number];

然后我尝试去掉后面的long 转换,也编译通过。因为如果是64位,那number不需要转换,如果是32位,那number int值是可以自动转化为long的,那么Xcode为什么要推荐在后面转换呢? 不得其解,有知道的朋友告诉我,谢谢

[NSString stringWithFormat:@"%ld", number];

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值