在iOS中调用一个方法,实际上是调用一个方法实现的函数指针并传给他对象实例指针,一个Selector,还有函数用到的参数。在Objective-C 中,每个方法调用其实都是转换成了调用objc_msgSend方法。 缓存
objc_msgSend的调用过程以下: 函数
0)首先检查消息接受对象是否为nil. 若是消息接受对象为nil,则触发nil-handler. 默认nil-handler是什么都不作的。 指针
1)在垃圾回收环境中(Mac OS X)中,检查是否调用了(retain, release, autorelease, retainCount), 若是是,就返回self. 因此,这就意味着在垃圾回收机制中,retainCount 返回self。这时调用retainCount就会产生无限循环。 对象
2)检查class的缓存中是否有该方法的实现,若是有,调用。 get
3)在类方法中是否有该方法,若是有就调用类方法的实现。 io
4)查看父类中是否有该方法实现,若是没有再查找父类的父类中有没有实现。若是找到了,调用。 class
5)调用resolveInstanceMethod:(或者resolveClassMethod:). 若是返回YES, 则调用。 该对象会有该方法的实现,由于它会调用class_addMethod. 垃圾回收
6) 调用forwardingTargetForSelector:. 若是返回non-nil, 则对返回对象发消息。此处不会返回self,不然会进入无限循环。 循环
7)调用methodSignatureForSelector:, 若是返回non-nil, 建立一个NSInvocation 而且将这个NSInvocation传递给forwardInvocation:. 方法
8) 调用doesNotRecognizeSelector:. 默认实现就是抛一个异常。