Object-C中int和NSInteger数值类型的区别

1.在iOS开发中我们比较喜欢使用int类型的变量,可是你仔细研究过C语言中的int和OC中int的区别了吗?
下面我们来分析下:
查到c语言中,int和long的字节数是和操作系统指针所占位数相等。
但c语言中说,long的长度永远大于或等于int
Objective-C里,苹果的官方文档中总是推荐用NSInteger

原来在苹果的api实现中,NSInteger是一个封装,它会识别当前操作系统的位数,自动返回最大的类型。
定义的代码类似于下:

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

You usually want to use NSInteger when you don’t know what kind of processor architecture your code might run on, so you may for some reason want the largest possible int type, which on 32 bit systems is just an int, while on a 64-bit system it’s a long.

总结:NSInteger与int的区别是NSInteger会根据系统的位数(32or64)自动选择int的最大数值(int or long)。

2.听你这么一说,那我以后全部用NSInteger吧,哈哈…那我们看下下面的问题
(如果你是这样写的,默默”喜欢”一下我的文章吧)
之前我们公司的iOS开发者,经常会写出下面的代码,最后都被我纠正了…

        NSInteger type;
        type=1;
        NSString *Type=[NSString stringWithFormat:@"%d",type];

可能有朋友说,这段代码没有问题啊(你要是不深究的话,也不算问题哈)!其实我想说的是这边会出现一个警告:

《Object-C中int和NSInteger数值类型的区别》 33DC0C55-807A-4BA2-BE1D-4E8F90F51E60.png

我们来看下这个警告:
这个警告实际上是类型不匹配的问题,那么怎么修改呢?
只要把”%d”—>”%zi”就好了.看修改后的代码

        NSInteger type;
        type=1;
        NSString *Type=[NSString stringWithFormat:@"%zi",type];

《Object-C中int和NSInteger数值类型的区别》 75E83558-25D0-4EAE-B36C-52965D83CF6D.png

总结下:
“%zi”是OC特有的格式化输入输出控制字符串….有兴趣的可以自己试下哈
PS:每天一篇小总结文章,都是iOS开发中遇到的小问题,喜欢的话,就关注我吧

    原文作者:D了个Y
    原文地址: https://www.jianshu.com/p/eefaba07ae58
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞