欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

对Objective-C元编程的理解

程序员文章站 2024-01-07 12:46:40
...

Objective-C在元编程方面的能力相当强,有那么一点Ruby的风范。

1. 分类(Category)概念,与Ruby中的模块类似,但更简单和纯粹一些。

2. 类方法只能被类调用,实例方法只能被实例调用,这点与Ruby一致。

3. NSObject是一种根类(root class),不仅指它是绝多数类的祖先类,而且还是“元类”(metaclass 在Objc中,貌似无法直接触及到)的祖先类。因此,凡是NSObject的实例方法,也是其自身和子类的类方法,相当的抽象。

例如:respondsToSelect:方法定义为NSObject的一个实例方法。它既可以作为类方法被NSObject和其子类调用,也可以作为实例方法被NSObject和其子类的实例调用。唯一的区别是,作为类方法调用时,该方法告知对应的类和其父类是否具有指定的类方法,而作为实例方法调用时,告知它们是否具有指定的实例方法。

4. “元类”的含义是什么?简单的讲,就是保存有对象实例方法信息的类。普通的类就是其实例的“元类”。那类的“元类”是什么呢?在Objc中,我认为它是个概念,无法实际触及。普通类中定义的类方法,可以视为在其“元类”中的实例方法。也就是说,在类中定义的+方法,实际上就是对应“元类”中的-方法。只是因为“元类”无法触及,所以只能作为+方法在类中定义了。当调用类的类方法时,运行时(Runtime)会到其对应的“元类”中找-方法,就如同调用实例的方法时,到类中找-方法那样。

5. 当对象接收到一个消息且这个对象无对应处理方法时,运行时会调用methodSignatureForSelector:方法获取对应方法的信息。如果methodSignatureForSelector:方法返回为空,则直接异常。如果返回非空,则运行时进一步调用forwardInvocation:方法。

上一篇:

下一篇: