OC数据类型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CJXBShowZhouyujuan/article/details/53996016

今天做项目的时候遇到了一些问题,发现自己对OC的数据类型的认识还有点欠缺,于是就总结了一点东西

(1)C基本数据类型

Int;float;double;short Int;long long Int;char;

(2)OC的数据类型

NSInteger,NSUInteger,NSNumber,NSString,NSArray, NSDictionary,NSSet

(3)空类型

nil;NULL;NSNULL;Nil;

各种类型在使用是的差异分析;

(1)第一部分的之所以称之为C基本数据类型,是因为这部分的使用是和C完全相同的。它和NSInteger是有区别的

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedeflong NSInteger;
typedefunsigned long NSUInteger;
#else
typedefint NSInteger;
typedefunsigned int NSUInteger;
#endif

这里可以清楚的看出NSInteger和int,NSUInteger和unsigned int之间的区别。mac的OS X系统即为LP64,而后面则是指具体的目标硬件设备。所以NSInteger/NSUIteger与对应的int/unsigned int不是完全相等的,与对应的long/unsigned long也不是完全相等的。而是要看具体的运行环境及其硬件设备

从上面的定义可以看出NSInteger/NSUInteger是一种动态定义的类型,在不同的设备,不同的架构,有可能是int类型,有可能是long类型。

(2)NSUInteger和NSInteger的区别:
NSUInteger 是无符号的,没有负数。NSInteger 是有符号的可以有负数。

(3)为什么还要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。
NSInteger是基础类型,NSNumber是一个类,如果需要存储一个数值,直接使用NSInteger是不行的,比如在一个数组里使用下面的语句就会报错:
NSMutableArray * array = [[NSMutableArray alloc]init];
[array addObject:3];
这里是需要把3变成[NSNumber numberWithInt:3];

(3) nil 、NULL、 Nil 、NSNull 的区别

nil,定义一个空的实例,指向OC中对象的空指针。

eg:
NSString *someString = nil;
id someObject = nil;
if (anotherObject == nil) {}// do something

NULL,NULL可以用在C语言的各种指针上。

在Objective-C里,nil对象被设计来跟NULL空指针关联的。他们的区别就是nil是一个对象,而NULL只是一个值。而且我们对于nil调用方法,不会产生crash或者抛出异常。

Nil,定义一个空的类

Class someClass = Nil;

NSNull是一个类,它定义了一个单例对象用于表示集合对象的空值

集合对象无法包含nil作为其具体值,如NSArray、NSSet和NSDictionary。相应地,nil值用一个特定的对象
NSNull来表示。NSNull提供了一个单一实例用于表示对象属性中的的nil值。默认的实现方法中,
dictionaryWithValuesForKeys:和setValuesForKeysWithDictionary:自动地将 NSNull和nil相互转换,因此您的对象不需要进行NSNull的测试操作。

本文主要是对比一些数据类型,并没有对全部的进行说明。

猜你喜欢

转载自blog.csdn.net/CJXBShowZhouyujuan/article/details/53996016