黑马程序员--Objective-C 中类的理解

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

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,就是这个类的类。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值