1
lldong 2012-02-14 23:21:52 +08:00
Objective-C的设计受到Smalltalk很大的影响,为了方便代码维护,所以从Smalltalk借鉴了category的概念,让你能够将一个类的实现分割到不同文件中。
protocol只是定义接口,并不能添加实现(功能),类似于Java中的interface(据说Java中的interface就是从Objective-C中借鉴过来的)。 message forward是Objective-C消息机制的一部分,让对象在接收到一个无法识别的消息后能在运行时处理这个错误,像NSProxy也是利用了这个机制。 |
2
myrual OP @lldong 对象什么情况下会接受到一个无法识别的消息呢?
或者说什么情况下会给一个对象发一个无法处理的消息呢? 从我的理解来说大概的场景是: class b 实现了一个消息处理过程 class a 原本不需要这个消息处理过程,但是后来又希望class a能处理该消息,所以用forward可以不用重复写代码,也不用修改继承关系。 |
3
lldong 2012-02-15 00:14:20 +08:00
@myrual 简单来说,比如你有一个你有一个Foo对象foo,但它没有实现bar方法。现在你调用你发送[foo bar], 这是它会根据foo的isa指针(该指针指向其类对象,在Objective-C里面类也是一个对象)查找该方法的实现,如果没有,它会去其父类查找如此下去,如果最后还是找不到就会进入一个fallback:
1. 调用 resolveInstanceMethod,你可以在这里动态添加一个实现,并返回YES. 2. 如果第一步返回NO,回进入 forwardingTargetForSelector:, 可以给这个消息指定一个新的target,如果没有则进入第三步 3. forwardInvocation,你可以构建一个NSInvocation 如果这三步都没结果就会抛异常了。 |