前面我们留下了一点东西没说,那就是如果某个对象调用了不存在的方法时会怎么样,一般情况下程序会crash,错误信息类似下面这样:
unrecognized
selector sent to instance 0x7fd0a141afd0
但是在程序crash(缓存)之前,Runtime会给我们动态方法解析的机会,消息发送的步骤大致如下:
1.检测这个selector是不是要忽略的。比如Mac OS X开发,有了垃圾回收就不理会retain,release这些函数了
2.检测这个target是不是nil对象。ObjC的特性是允许对一个nil对象执行任何一个方法不会Crash,因为会被忽略掉
3.如果上面两个都过了,那就开始查找这个类的IMP,先从cache里面找,完了找得到就跳到对应的函数去执行
如果cache找不到就找一下方法分发表
4.如果分发表找不到就到超类的分发表去找,一直找,直到找到NSObject类为止
网友评论