iOS (二)id类型

id的声明

在usr/include /objc / objc.h里面有:

/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;

/// Represents an instance of a class.
struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};

/// A pointer to an instance of a class.
typedef struct objc_object *id;

所以,id可以用于指向所有的Objective-C对象,是一种万能指针,类似于C语言中的void*。

NSObject *

NSObject *可以指向所有继承自NSObject的类生成的对象。在Objective-C中,几乎所有类都是继承自NSObject,但是也有例外,比如NSProxy就并非继承自NSObject。

所以,NSObject *能够指向的范围比id要小一些。

id表示基础类型

其实,id 还可以表示基础类型,但是不能表示float,double类型。

在MRC中,id可以表示int、NSInteger、BOOL等类型(虽然会有警告),但是在ARC中会报错。即使在MRC中,也不能表示float,double类型。

id的作用

1、可以用于动态绑定。编译器看到id以后,认为是动态类型,不再检查类型。

2、多态, 可以减少代码量, 避免调用子类特有的方法需要强制类型转换

3、可以用于代理(delegate)。在声明代理的时候,根本不用关心代理的类型是什么。

4、有的时候,你不知道变量的类型,就可以使用id。比如,在一个存储着NSString和NSNumber和数组中,想要找出所有的字符串。由于不确定取出的元素是哪种类型,就可以使用id进行声明,然后再判断类型。

你可能感兴趣的:(iOS (二)id类型)