oc调用方法流程
1.先去自己cache中查找,再去类的方法列表中查找
2.再去父类的cache中和方法列表中
//动态方法解析
3.runtime会调用resolveInstanceMethod方法和resolveCalssMethod方法给我们一次添加方法的实现的机会,在这里这调用class_addMethod方法添加方法的实现
class_addMethod([self class], sel, (IMP)aTestMethod, "v@:");
第一个参数是往哪个类里面添加方法,第二个是调用的方法选择器,第三个是方法的实现,即函数指针,指向要添加的方法的实现,第四个是返回值和参数类型Type Encoding
如果添加成功就返回YES否则返回NO
//重定向
4.在消息转发机制执行前runtime会允许我们替换方法的接受者即Target
通过forwrdingTargetForSelector:(SEL)aSelector方法
如果方法返回的是nil或者self则进入消息转发机制否则对返回的对象发送消息
5.当触发消息转发机制forwardInvocation:方法调用这里的NSInvocation里面包含消息的名字、参数、调用者、返回值等信息
在这里可以调用下面的函数更改消息的调用者
[anInvocation invokeWithTarget:someOthertarget]
[anInvocation selector] //这个获取方法选择器
anInvocation参数的由来—在调用forwardInvocation:方法之前runtime会调用methodSignatureForSelector:获取到返回的方法签名生成NSInvocation对象所以重写forwardInvocation:之前也要重写methodSignatureForSelector:方法否则会抛出异常
NSObject方法中的forwardInvocation:方法只是实现了doesNotRecognizeSelector:方法我们可以实现自己的forwardInvocation:将消息转发给其他对象
forwardInvocation:这个方法是不能识别的消息的分发中心在这里可以将不能识别的消息转发给别的对象或者将消息翻译成另外的消息或者吃掉因此没有响应也不会报错
forwardInvocation:这个方法只有在消息的接收对象无法响应的时候才会被调用,否则这个方法不会调用
[self class] , object_getClass(self),object_getClass([self class]),
1.self是实例对象时,[self class]与object_getClass(self)等价,应为前者会调用后者,object_getClass([self class]),返回的是元类
2.self是类对象的时候,[self class],返回的就是本身self ,object_getClass(self)和object_getClass([self class]),是等价的
+(id)Class
{
return self;
}
-(id)class {
return object_getClass(self);
}
网友评论