------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
这时候 编译器就会报错:"Interface type cannot be statically allocated"
id 对象的定义如下:
此结构体存放类的 元数据 (metadata),例如类的实例实现了几个方法,具备了多少个实例变量等信息。结构体的首个变量也是 isa 指针,说明 Class 本身也是 Objective-C 对象。对象所属的类型(即 isa 指针所指向的对象类型)是另一个类,叫做 元类 (metaclass),用来表述对象本身所具备的元数据。类方法就定义在此处,因为这些方法可以理解成类对象的实例方法。每个类仅有一个类对象,每个类对象也仅有一个与之相关的元类。
Objective-C类是由Class类型来表示的,它实际上是一个指向objc_class结构体的指针。它的定义如下:
NSString *pointerVariable = @"someString";
pointerVariable
是栈上的一个指针变量,
@"someString"
是堆上的内存对象,
pointerVariable
变量内存放着堆上对象的内存地址。如果想把 Objective-C 对象分配在栈上:
NSString pointerVariable = @"someString";
这时候 编译器就会报错:"Interface type cannot be statically allocated"
而对于通用对象类型 id,由于其本身已经是指针类型,所以可以这样写:
id genericTypeString = @"someString";
id 对象的定义如下:
typedef struct objc_object {
Class isa;
} *id;
由此可见,每个对象结构体的首个成员是 Class 类的变量,通常被称为“is a”指针,顾名思义,表示“是一个”的含义。如前面例子所用的对象就可以翻译成“is a NSString”,即“我是一个 NSString 类型的对象”。那么 Class 是什么呢?
typedef struct objc_class *Class;
struct objc_class {
Class isa; //指向对象类型
Class super_class; //指向父类的
const char *name; //类名
long version; //类的版本信息,默认为0
long info; //供运行期使用的一些位标识。
long instance_size; //类的实例变量大小
struct objc_ivar_list *ivars; //成员变量的数组
struct objc_method_list **methodList; //方法定义的数组,注意这里是“**”
struct objc_cache; //指向最近使用的方法,用于方法调用的优化.
struct objc_protocol_list *protocols; //协议的数组
}
此结构体存放类的 元数据 (metadata),例如类的实例实现了几个方法,具备了多少个实例变量等信息。结构体的首个变量也是 isa 指针,说明 Class 本身也是 Objective-C 对象。对象所属的类型(即 isa 指针所指向的对象类型)是另一个类,叫做 元类 (metaclass),用来表述对象本身所具备的元数据。类方法就定义在此处,因为这些方法可以理解成类对象的实例方法。每个类仅有一个类对象,每个类对象也仅有一个与之相关的元类。
“元(meta)”是什么?
其实这就是个英语问题,元就是 meta,对元的理解其实就是对 meta 的理解。那么 meta 是啥?meta 在英语里并不是单字,通常会和后面的词连接起来,用以描述后面的词,表示“关于...的...”,这么说很抽象。举个例子,比如 meta-data 就是“关于数据的数据”,即这个数据大小、类型等用来描述数据的数据信息,再比如 meta-language 就是“关于语言的语言”,meta-class,就是这个类的类。