您的位置:首页 > 产品设计 > UI/UE

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

2015-01-15 16:07 435 查看
在使用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];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐