对Objective-C元编程的理解
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:方法。