我们说Objective-C是C语言的一个超集,Objective-C中的基本类型和C语言中的基本类型一样.主要有:int,long,float,double,char,void, bool等.对于基本类型变量,不需要用指针,也不用手动回收,方法执行结束会自动回收。

但Objective-C中也有一些与其他语言”不同”的数据类型,其实所谓的”不同”也只是关键字不同而已,在其他语言中我们也总能找之与之对应的数据类型.

id类型

id数据类型可存储任何类型的对象.从某种意义上说,它是一般对象类型.在概念上,类似java 中的object ,可以转换为任何数据类型。id 和void *objc并非完全一样。我们可以查看id在官方opensource objc.h中的定义:objc.h

从源码中我们可以看出 id 是指向struct objc_object 的一个指针。也就是说,id 是一个指向任何一个继承了Object(或者NSObject)类的对象。需要注意的是id 是一个指针,所以你在使用id的时候不需要加星号。比如id foo=nil定义了一个nil指针,这个指针指向NSObject的一个任意子类。而id *foo=nil则定义了一个指针,这个指针指向另一个指针,被指向的这个指针指向NSObject的一个子类。

nil

nil和java语言的null相同,在objc/objc.h 中定义。nil表示一个Objctive-C对象,这个对象的指针指向空.

A null pointer to an Objective-C object.

NSString *someString = nil;
NSURL *someURL = nil;
id someObject = nil;
if (anotherObject == nil) // 判断对象是否为空

Nil

首字母大写的Nil和nil有一点不一样,Nil定义一个指向空的类(是Class,而不是对象)。Nil是一个类指针为空.

A null pointer to an Objective-C class.

Class someClass = Nil;
Class anotherClass = [NSString class];

NULL

NULL是基本数据类型为空

A null pointer to primitive type or absence of data.  is for C-style memory pointers.

int *pointerToInt = NULL;
char *pointerToChar = NULL;
struct TreeNode *rootNode = NULL;

NSNull

在集合对象中,表示空值的对象

A class defines a singleton object used to represent null values in collection objects (which don’t allow nil values. nil mean the end of the collection

if obj is nil , [obj message] will return NO, without NSException if obj is NSNull , [obj message will throw a NSException

例如:

for (NSString *name in departmentNames)
    NSLog(@"%@", [name lowercaseString]);

当name为空时,将会发生空指针的异常.

改进后的代码为:

for (NSString *name in departmentNames)
    if (name != [NSNull null])
         NSLog(@"%@", [name lowercaseString]);

在NSArray和NSDictionary中nil中有特殊的含义(表示列表结束),所以不能在集合中放入nil值。如要确实需要存储一个表示”什么都没有”的值,可以使用NSNull类。例:[NSMutableArrayObj addObject: [NSNull null]];

SEL

SEL是选择器@selector()返回的结果类型,表示一个方法的名字.

程序执行的时候,我们可以方便的通过方法的名字,获取到方法的 ID 也就是我们所说的 SEL, 反之亦然。具体的使用方法如下:

  1. SEL 变量名 = @selector(方法名字);
  2. SEL 变量名 = NSSelectorFromString(方法名字的字符串);
  3. NSString *变量名 = NSStringFromSelector(SEL 参数);

## IMP IMP是”implementation”的缩写,它是objetive-C 方法(method)实现代码块的地址,可像C函数一样直接调用。通常情况下我们是通过[object method:parameter]或objc_msgSend()的方式向对象发送消息,然后Objective-C运行时(Objective-C runtime)寻找匹配此消息的IMP,然后调用它;但有些时候我们希望获取到IMP进行直接调用。

说白了IMP就是实现方法,给一个方法起个名字,实现动态调用,不用再使用[对象 message]的方式。

Class

当一个类被正确的编译过后,在这个编译成功的类里面,存在一个变量用于保存这个类的信息。我们可以通过一个普通的字符串取得这个 Class,也可以通过我们生成的对象取得这个Class。Class被成功取得之后,我们可以把这个 Class 当作一个已经定义好的类来使用它(有没有想起java中的反射?)。这样的机制允许我们在程序执行的过程当中,可以 Class 来得到对象的类,也可以在程序执行的阶段动态的生成一个在编译阶段无法确定的一个对象。 因为 Class 里面保存了一个类的所有信息,当然,我们也可以取得一个类的超类。关于 Class 类型,具体的使用格式如下:

  1. Class 变量名 = [类或者对象 class];
  2. Class 变量名 = [类或者对象 superclass];
  3. Class 变量名 = NSClassFromString(方法名字的字符串);
  4. NSString *变量名 = NSStringFromClass(Class 参数);