objective-c_runtime_programming_guide_笔记03_dynamic_method_resolution

Objective-C Runtime Programming Guide 笔记03 Dynamic Method Resolution

1.implement a method dynamically
@dynamic propertyName

表明会动态的提供与该属性联系的方法.
可以分别通过实现resolveInstanceMethod:resolveClassMethod:方法来动态的实现指定选择器的实例方法或类方法.
一个Objective-C方法简单来说就是一个至少有两个参数(self 和 _cmd)的C函数.可以使用class_addMethod函数将一个函数添加为一个类方法.

void dynamicMethodIMP(id self,SEL _cmd){
    //implementation...
 }

使用resloveInstanceMethod:动态的将以上方法增加为一个类的方法.

@implementation MyClass 
+(BOOL)resolveInstanceMethod:(SEL)aSEL{
 if(aSEL == @selector(resolveThisMethodDynamically)){
        class_addMethod([self class],aSEL,(IMP) dynamicMethodIMP,"v@:");
        return YES;
    }
    return [super resolveInstanceMethod:aSEL];
 }
 @end

Forwarding methods 和 dynamic method 是 orthogonal的.
一个类在forwarding 机制生效前可以解析动态方法.如果调用了respondsToSelector:instanceRespondToSelector:,动态方法解析器首先会提供给选择器一个IMP.如果你实现了resolveInstanceMethod:但是需要一个指定的选择器通过forwarding 机制更精准的传递,则需要为这个选择器 return NO.
尽管Mach-O(objc_loadModlules)中提供了动态载入Objective-C的函数,但是Cocoa’s 的NSBundle提供了更为方便的动态加载方法(dynamic loading).

2. Message Forwarding

向不处理消息的对象发送消息会报错,但是在报错之前,runtime system会给接受消息的对象第二次机会去处理这条消息.
报错之前,runtime会向对象,发送一条只带有一个NSInvocation对象参数的forwardInvocation:消息.NSInvocation对象内部封装了传递过来的原始的消息和参数.
可以通过实现forwardInvocation:方法给这个消息一个默认的响应,或者其他方式避免报错.如名所示,forwardInvocation通常被用来将消息传递给另外一个对象.
Even if your class can’t inherit a method,you can still “borrow” it by implementing a version of the method that simply passes the message on to an instance of the other class:

-(id)negotiate
{
    if([someOtherObject respondsTo:@selector(negotiate)])
        return [someOtherObject negotiate];
    return self;
}

这样需要实现每一个需要跨类调用的方法,并且当添加了新类和新方法的时候,这里也需要做相应的修改.
dynamic rather than static
工作机制如下:

  1. 当一个对象不能响应selector所对应的消息的时候,runtime system 想该对象发送一条forwardInvocation:.每个对象都从NSObject 类继承了一个forwardInvocation:方法,但是NSObject中的该方法只是调用了doesNotRecognizeSelector:方法.在继承的类中重写forwardInvocation:方法,可以进一步提供传递消息给其他类的方法.
    为了传递消息,所有的forwardInvocation:方法需要做如下工作:

    明确消息发送到哪.
    将原始参数发动至那里
    传递消息可以通过invokeWithTarget:方法发送:
    forwardInvocation:的实现:

    -(void)forwardInvocation:(NSInvocation *)anInvocation
    {
    if([someOtherObject respondsToSelector:[anInvocation selector]])
      [anInvocation invokeWithTarget:someOtherObject];
    else
     [super forwardInvocation:anIncation];
    }

这里写图片描述
Forwarding mimics inheritance can be used to lend some of the effects of multiple inheritance to Objective-C programs.

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值