美文网首页
消息动态解析

消息动态解析

作者: 海牛骑士 | 来源:发表于2019-03-27 14:22 被阅读0次

在某些情况下你可能需要动态的提供方法,比如在oc中你声明某个属性为@dynamic类型,编译器就认为与这属性相关的方法会动态提供。你可以通过实现resolveInstanceMethod:resolveClassMethod:动态的为selector提供实现方法,objective-c方法本质上就是一个带有至少两个参数(_self和_cmd)的c函数,你可以通过 class_addMethod为类添加一个函数,参见下面的例子:

@interface SomeClass : NSObject
@property (assign, nonatomic) float objectTag;
@end

@implementation SomeClass
@dynamic objectTag;  //声明为dynamic
//添加setter实现
void dynamicSetMethod(id self,SEL _cmd,float w){
    printf("dynamicMethod-%s\n",[NSStringFromSelector(_cmd)
                                 cStringUsingEncoding:NSUTF8StringEncoding]);
    printf("%f\n",w);
    objc_setAssociatedObject(self, ObjectTagKey, [NSNumber numberWithFloat:w], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
//添加getter实现
void dynamicGetMethod(id self,SEL _cmd){
    printf("dynamicMethod-%s\n",[NSStringFromSelector(_cmd)
                                 cStringUsingEncoding:NSUTF8StringEncoding]);
   [objc_getAssociatedObject(self, ObjectTagKey) floatValue];
}

//解析selector方法
+(BOOL) resolveInstanceMethod: (SEL) sel{
    
    NSString *methodName=NSStringFromSelector(sel);
    BOOL result=NO;
    //动态的添加setter和getter方法
    if ([methodName isEqualToString:@"setObjectTag:"]) {
        class_addMethod([self class], sel, (IMP) dynamicSetMethod,
                        "v@:f");
        result=YES;  
    }else if([methodName isEqualToString:@"objectTag"]){
        class_addMethod([self class], sel, (IMP) dynamicGetMethod,
                        "v@:f");
        result=YES;
    }
    return result;
}

看看class_addMethod函数:

BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types)
参数说明:
cls:添加方法的类
name:selector名称
imp:selector对应得具体实现
types:一个定义该函数返回值类型和参数类型的字符串

通过上面动态的添加getter和setter方法后,调用如下代码程序就不会crash。
self.objectTag=10.0f;
float tag = self.objectTag

在消息转发机制开始之前,一个类有机会先动态解析该方法,如果你实现了 resolveInstanceMethod:,但是对一些特定的selectors想启用消息转发机制,只需要过滤这些selector返回NO即可。

相关文章

  • Runtime(二)

    objc_msgSend 包括以下三个步骤 消息发送 动态方法解析 消息转发 消息发送 动态方法解析 消息转发 如...

  • MG--iOS 消息机制

    msgSend 消息发送 动态方法解析 动态添加方法image.png 消息转发

  • 08.Objective-C 消息机制

    问题 消息机制的三个阶段 1.消息机制发送消息阶段-消息发送2.消息机制动态方法解析阶段 -动态解析3.消息机制消...

  • 消息动态解析

    在某些情况下你可能需要动态的提供方法,比如在oc中你声明某个属性为@dynamic类型,编译器就认为与这属性相关的...

  • unrecognized selector sent to in

    消息转发以及动态解析方法 消息转发机制基本上分为三个步骤: 动态方法解析 备用接收者 完整转发 首先,对于动态方法...

  • Runtime 方法调用本质(消息发送、动态方法解析、消息转发)

    动态方法解析、消息转发 如果方法实现(imp)没有找到会尝试一次动态方法解析,源码如 动态方法解析调用 "_cla...

  • 消息机制

    消息机制流程 消息发送 动态方法解析 消息转发image.png 动态方法解析 如果在当前类,父类都没有找到该方法...

  • 消息机制

    消息发送 objc_msgSend流程 动态方法解析流程 消息转发流程

  • OC 消息转发流程分析

    上一篇消息查找流程 探索了消息查找流程:快速查找和慢速查找以及动态方法解析。但消息机制还不完整,如果动态方法解析之...

  • 消息转发流程

    动态方法解析 备用接收者 完整消息转发

网友评论

      本文标题:消息动态解析

      本文链接:https://www.haomeiwen.com/subject/eqpccqtx.html