今天做项目的时候遇到了一些问题,发现自己对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的测试操作。
本文主要是对比一些数据类型,并没有对全部的进行说明。