zoukankan      html  css  js  c++  java
  • int、NSInteger、NSUInteger、NSNumber的区别和联系

    1、首先先了解下NSNumber类型:

    NSNumber是NSValue的一个子类,它是一个对象来存储数字值包括bool型,它提供了一系列的方法来存储char a signed or unsigned char, short int, int, long int, long long int, float, or double or as a BOOL,它提供了一个compare:方法来决定两个NSNumber对象的排序;

    创建一个NSNumber对象有以下方法:

     1 + (NSNumber *)numberWithChar:(char)value;
     2 + (NSNumber *)numberWithUnsignedChar:(unsigned char)value;
     3 + (NSNumber *)numberWithShort:(short)value;
     4 + (NSNumber *)numberWithUnsignedShort:(unsigned short)value;
     5 + (NSNumber *)numberWithInt:(int)value;
     6 + (NSNumber *)numberWithUnsignedInt:(unsigned int)value;
     7 + (NSNumber *)numberWithLong:(long)value;
     8 + (NSNumber *)numberWithUnsignedLong:(unsigned long)value;
     9 + (NSNumber *)numberWithLongLong:(long long)value;
    10 + (NSNumber *)numberWithUnsignedLongLong:(unsigned long long)value;
    11 + (NSNumber *)numberWithFloat:(float)value;
    12 + (NSNumber *)numberWithDouble:(double)value;
    13 + (NSNumber *)numberWithBool:(BOOL)value;
    14 + (NSNumber *)numberWithInteger:(NSInteger)value NS_AVAILABLE(10_5, 2_0);
    15 + (NSNumber *)numberWithUnsignedInteger:(NSUInteger)value NS_AVAILABLE(10_5, 2_0);
     初始化方法:
     1 - (id)initWithChar:(char)value;
     2 - (id)initWithUnsignedChar:(unsigned char)value;
     3 - (id)initWithShort:(short)value;
     4 - (id)initWithUnsignedShort:(unsigned short)value;
     5 - (id)initWithInt:(int)value;
     6 - (id)initWithUnsignedInt:(unsigned int)value;
     7 - (id)initWithLong:(long)value;
     8 - (id)initWithUnsignedLong:(unsigned long)value;
     9 - (id)initWithLongLong:(long long)value;
    10 - (id)initWithUnsignedLongLong:(unsigned long long)value;
    11 - (id)initWithFloat:(float)value;
    12 - (id)initWithDouble:(double)value;
    13 - (id)initWithBool:(BOOL)value;
    14 - (id)initWithInteger:(NSInteger)value NS_AVAILABLE(10_5, 2_0);
    15 - (id)initWithUnsignedInteger:(NSUInteger)value NS_AVAILABLE(10_5, 2_0);

    NSNumber类型有点类似id类型,对于任何类型的数字对象都能用它来声明,也就是用它来声明数字对象,通过声明,很难判断声明变量是什么数字类型,确定数字对象类型多是在初始化的时候才能确定。

    数字对象的创建或者初始化:

    格式:

    NSNumber 数字对象 = [NSNumber numberWith数字类型:数值];

    1 intNumber = [NSNumber numberWithInt:100];

    2 longNumber = [NSNumber numberWithLong:0xabcdef];

    3 floatNumber = [NSNumber numberWithFloat:10.01]; 

    2、 int、 NSInteger、 NSUInteger、NSNumber之间的区别和联系

    int : 当使用int类型定义变量的时候,可以像写C程序一样,用int也可以用NSInteger,推荐使用NSInteger ,因为这样就不用考虑设备是32位还是64位了。

    NSUInteger是无符号的,即没有负数,NSInteger是有符号的。

    NSInteger是基础类型,NSNumber是一个类,如果需要存储一个数值,直接使用NSInteger是不行的,比如在一个数组里使用下面的语句就会报错:

    1 NSArray *array = [NSArray alloc] init];
    2 [array addObject:3];

    因为array里应该是一个类,但‘3’不是,所以需要用NSNumber:

    1 NSArray *array = [NSArray alloc] init];

    2 [array addObject:[NSNumber numberWithInt:3]]; 

    int和NSInteger区别

     

    查到c语言中,int和long的字节数是和操作系统指针所占位数相等。

    但c语言中说,long的长度永远大于或等于int

    objective-c里,苹果的官方文档中总是推荐用NSInteger

    它和int有什么区别呢,stackoverflow这帮大神给了答案。

    原来在苹果的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)。

     
  • 相关阅读:
    加密算法 科普文
    《电商后台系统产品逻辑解析》学习笔记
    基于Docker的Consul服务发现集群搭建
    从阿里中台战略看企业IT架构转型之道
    CanalSharp.AspNetCore v0.0.4-支持输出到MongoDB
    领域驱动设计学习之路—DDD的原则与实践
    一个实时收集MySql变更记录的组件CanalSharp.AspNetCore
    基于Jenkins Pipeline的ASP.NET Core持续集成实践
    熊逸《唐诗50讲》感时篇
    一个Mini的ASP.NET Core框架的实现
  • 原文地址:https://www.cnblogs.com/guchengfengyun/p/4112821.html
Copyright © 2011-2022 走看看