Board logo

标题: iOS消息转发机制(2) [打印本页]

作者: look_w    时间: 2019-2-19 17:25     标题: iOS消息转发机制(2)

消息转发

消息转发有下面几个阶段

    “动态方法解析”,征询接收者所属的类,是否需要动态添加方法,来处理这个未找到的方法。
    “备用接受者”,转发给其他的对象处理这个方法。
    “完整的消息转发机制”,如果未声明其他对象处理,或者其他对象处理失败了,那么系统就会把消息所有相关的封装成一个NSInvocation对象,我们可以拿到这个NSInvocation对象,addTarget指明方法的处理者。

下面我们通过一个demo来理解下消息转发
新建一个Person的类

    #import <Foundation/Foundation.h>
     
    @interface Person : NSObject
    @property (nonatomic,copy) NSString *name;
    - (instancetype)initNSString *)name;
    - (void)eat;
    - (void)sleep;
    @end

这个类有一个init方法和两个实例方法,对应.m都有实现。

    #import "erson.h"
    @implementation Person
    - (instancetype)initNSString *)name{
        self = [super init];
        if (self) {
            _name = name;
        }
        return self;
    }
     
    - (void)eat{
        NSLog(@"i love fish");
    }
     
    - (void)sleep{
        NSLog(@"good night");
    }
    @end

现在我们再创建一个Developer的类继承于Person

    #import "erson.h"
     
    @interface Developer : Person
    - (void)developerCoding;
    - (void)developerDebug;
    @end

.m里面实现了developer前缀的两个方法

    #import "Developer.h"
     
    @implementation Developer
    - (instancetype)initNSString *)name{
        self =  [super init:name];
        if (self) {
            
        }
        
        return self;
    }
     
    - (void)developerCoding{
        NSLog(@"class:%@, sel:%s",self,sel_getName(_cmd));
        NSLog(@"i hate pm");
    }
     
    - (void)developerDebug{
        NSLog(@"class:%@, sel:%s",self,sel_getName(_cmd));
        NSLog(@"i hate bug");
    }
    @end

这个时候,我们创建一个Person的实例对象,并让它做一些事情

    Person *person = [[Person alloc] init"yuan"];
    [person eat];
    [person sleep];
    [person performSelectorselector(developerCoding)];
    [person performSelectorselector(developerDebug)];




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0