Objective-C 中的 Meta-class 是什么

转载 2015年07月06日 22:48:12

关注的是 Objective-C 中的一个陌生的概念—— meta-class。在 Objective-C 中的每个类都有一个相关联的 meta-class,但是你很少会直接使用 meta-class,他们仍旧保持着神秘的面纱。我们从在运行时创建一个类开始。通过查看 “class pair”,我会解释 meta-class 是什么,同时也会谈谈在 Objective-C 中的对象或者类相关的一些一般主题。
每个对象都有一个类。这是面相对象概念的基础知识,但在 Objective-C 中不是这样,它(译注:class)同样是这个数据的一部分。每个可以被当成对象的数据结构都在恰当的位置有一个指向一个类的指针。

在 Objective-C,一个对象的类由它的 isa 指针决定。isa 指针指向这个对象的 Class。

事实上,在 Objective-C 中的对象的定义看起来像这样:

1
2
3
typedef struct objc_object {
Class isa;
} *id;
这就是说:任何结构体只要以一个指向 Class 结构的指针开始的就可以被当成是 objc_object。

在 Objective-C 中的对象的一个重要的特性是,你可以向它们发送消息:
[@”stringValue”
writeToFile:@”/file.txt” atomically:YES encoding:NSUTF8StringEncoding error:NULL];
你可以这么做是因为,当你向一个 Objective-C 的对象(像这里的 NSCFString)发送消息的时候,runtime 沿着对象的 isa 指针找到了这个对象的 Class(这里是 NSCFString 的类)结构体。 Class 结构体中包含了一个这个类的方法列表和一个指向父类的指针,用于查找继承的方法。

关键点是 Class 结构体中定义了你可以向一个对象发送的消息。

meta-class 是什么?

现在,你可能已经知道,在 Objective-C 中一个 Class 也是一个对象。这就意味着你也可以向一个 Class 发送消息。

1
NSStringEncoding defaultStringEncoding = [NSString defaultStringEncoding];
这里,向 NSString 类发送了 defaultStringEncoding。

可以这么做是因为在 Objective-C 中每个 Class 它自己同样也是个对象。也就是说 Class 结构体必须以 isa 指针开始,然后就可以在二进制兼容(binary compatible)我上面介绍的 objc_object 结构了,接着下一个字段必须是一个指向它的父类的指针(要是类就是基类就是 nil)。

为了让我们在 Class 上调用一个方法,Class 的 isa 指针必须指向一个 Class 结构体,并且那个 Class 结构体必须包含我们可以在那个 Class 上调用的方法的列表。

这就引出了 meta-class 的定义:meta-class 是 Class 对象的类(the meta-class is the class for a Class object)。

简单来说:

当你向一个对象发送消息,就在那个对象的方法列表中查找那个消息。
当你想一个类发送消息,就再那个类的 meta-class 中查找那个消息。
meta-class 是必须的,因为它为一个 Class 存储类方法。每个类都必须有一个唯一的 meta-class,因为每个 Class 都有一个可能不一样的类方法。

meta-class 的类是什么?

meta-class,如之前的 Class,同样是个对象。这就意味着你也可以在它上面调用方法。自然的,这就意味着它也必须有一个类(译注:isa 指针)。

所有的 meta-class 使用它们基类的 meta-class (继承层次中最顶层的 Class 的 meta-class)作为它们自己的类。这就是说所有继承自 NSObject 的类(大部分的类),以 NSObject 的 meta-class 作为自己的 meta-class 的类。

遵循这个规则,所有的 meta-class 使用基类的 meta-class 作为他们的类,任何基类的 meta-class 将会是他们自己(它们的 isa 指向他们自己)。这就是说 NSObject 的 meta-class 的 isa 指针指向它们自己(是自己的一个实例)。

class 和 meta-class 的继承

和 Class 以 super_class 指针指向它的父类的方法一样,meta-class 以 super_class 指针指向 Class 的 super_class 的 meta-class。(译注:这句话有点绕,就是 super-class 一个指向 Class 的父类,一个指向 meta-class 的父类。Class 是一般对象的类型,meta-class 是 Class 的类型。)

进一步来讲,基类的 meta-class 设置 super_class 指针指向基类自己。

这个继承层次的结果就是,所有在这个继承层次中的的实例,类和 meta-class 都继承了基类的层次。

对于所有在 NSObject 层次中的实例,类和 meta-class,这就意味着所有 NSObject 的实例方法都是有效的。对于类和 meta-class,所有 NSObject 的类方法也同样是有效的。

所有这些在字面上相当让人困惑。Greg Parker 已经把实例,类,meta-class 还有他们的超类以非常棒的图解的方式聚合在一起,展示他们是如何在一起工作的。

Objective-C第七讲-分类与协议

分类(Category)允许向一个类文件中添加新的方法声明,它 不需要使用子类机制,并且在类实现的文件中的同一个名字 下定义这些方法。其语法举例如下:#import "ClassName.h" @in...
  • gwh111
  • gwh111
  • 2013年03月25日 11:39
  • 931

上古时代 Objective-C 中哈希表的实现

因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明。 ...
  • sun2728
  • sun2728
  • 2016年05月08日 11:20
  • 1564

Objective-C 中的id到底是什么

今天我就要来看清楚,id,你到底是个什么东西?
  • u013230511
  • u013230511
  • 2015年01月08日 08:22
  • 1290

OC语言之Objective-C简介

# Objective-C简介 ![](http://7xj0kx.com1.z0.glb.clouddn.com/qbs.png) ##1.Objective-C简介 - Objective-C是一...
  • u012938194
  • u012938194
  • 2016年02月06日 15:46
  • 3890

objective-c 消息是什么

参考资料1、罗朝辉 深入浅出 Cocoa 之消息基本概念与原理ClassClass 在objc/objc.h中的定义:typedef struct objc_class *Class;Class的含义...
  • Ashiyanshi
  • Ashiyanshi
  • 2015年07月13日 18:06
  • 331

【黑马程序员】Objective-C是什么?关于Objective-C的一些语法

---------- IOS培训、java培训、期待与您交流! ---------- -----Objective-C是什么? 你可以把它认为是语法稍稍有点不一样的c语言。虽然第一眼望上...
  • oFlyme12
  • oFlyme12
  • 2015年02月12日 13:00
  • 265

Objective-C学习之路-由浅入深

一、Objective-C简介Objective-C 简称OC /Obj-c Objective 是面向对象的,OC是在C语言的基础上添加了一些新的面向对象的语法,比较繁琐的语法封装的更为简单,所以...
  • qq_33750826
  • qq_33750826
  • 2017年02月09日 16:18
  • 1912

黑马程序员——为什么 Objective-C 很难——黑马 ios 技术博客

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 语法: 首先我们谈谈神马叫做编程语言,编程语言是一种让人们能读懂并且能够展现...
  • dumengqiu
  • dumengqiu
  • 2014年12月02日 14:16
  • 500

Objective-C考试2015年12月最新题库的试题

※ 选择题(共80题,每题1分)               1、OC中布尔(BOOL)类型的变量的值只有:答案:(B)             A、1/0             B、YES/NO ...
  • sanzhanggui123
  • sanzhanggui123
  • 2015年12月12日 15:47
  • 2093

详解Objective-C的meta-class ,runtime创建类,添加实例变量

比较简单的一篇英文,重点是讲解meta-class。翻译下,加深理解。 原文标题:What is a meta-class in Objective-C? 原文地址:http://www....
  • lybeen2007
  • lybeen2007
  • 2015年09月19日 23:51
  • 343
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Objective-C 中的 Meta-class 是什么
举报原因:
原因补充:

(最多只允许输入30个字)