消息转发
消息转发有下面几个阶段
“动态方法解析”,征询接收者所属的类,是否需要动态添加方法,来处理这个未找到的方法。
“备用接受者”,转发给其他的对象处理这个方法。
“完整的消息转发机制”,如果未声明其他对象处理,或者其他对象处理失败了,那么系统就会把消息所有相关的封装成一个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)]; |