今天的感觉东西不是很多 让我来稍微说一下
函数式的语言好比C++流派
大家都看过侠客行嘛 我猜大家应该都看过吧 这函数式好比就是张三李四发的赏善罚恶令牌一样的感脚 掉用了某个函数 就必须本身亲自来 亲爹亲儿子来都不行
这消息式就感觉比较的随意了 好比 邻居过喜事之类的事情 我们当邻居的 每个家庭中选一个代表去参加一下就行了 跟这种的感脚差不多 只不过 去参加的人 一定要具有某些功能而已 总不能去人家过喜事的人家里 送花圈吧 。。。所以去的人要会办事 (就是指某种能力)
Objective-C中的那些消息转发 说白了就是 到底派谁去 参加别人的喜事仅此而已
我们线定义三个类
GrandFather类(爷爷类)
第0种情况
@interface GrandFather : NSObject
- (void)goToXiShi;
@end
@implementation GrandFather
- (void)goToXiShi {
NSLog(@"老爷子自己去参加");
}
@end
当我们调用 [[GrandFather new] goToXiShi]; 结果显而易见的事
========================================
第1种情况
BUT。。。。。。。。。。。。。。。。。。。。。。。。。。
刚好今天老爷子偶感风寒去不了了 咋办?????? 时候不早了 别人都去了 不去个人不行啊 就在此时 老爷子说 没事能定的住
@interface GrandFather : NSObject
- (void)goToXiShi;
@end
@implementation GrandFather
voidgoToXiShi(id self, SEL _cmd) {
NSLog(@"老爷子定的住 还是要去");
}
+ (BOOL)resolveInstanceMethod:(SEL)sel {
if (see == @selector(sel)) {
class_addMethod(self, sel, (IMP)goToXiShi, "v@:");
return YES;
}
else {
return [super resolveInstanceMethod:sel];
}
}
@end
我们并没有实现GrandFather类的goToXiShi方法 而是转发消息给一个同名C函数
[[GrandFather new] goToXiShi]; 结果依旧
========================================
第2种情况
老爷子真的发烧了 走不动了
这时我们引入第二个类
@interface Father : NSObject
- (void)goToXiShi;
@end
@implementation Father
- (void)goToXiShi {
NSLog(@"老子自己去参加");
}
@end
GrandFather稍作修改
@interface GrandFather : NSObject
- (void)goToXiShi;
@end
@implementation GrandFather
+ (BOOL)resolveInstanceMethod:(SEL)sel {
return [super resolveInstanceMethod:sel];
}
- (id)forwardingTargetForSelector:(SEL)aSelector {
Father*father = [Father new];
if ([father respondsToSelector:aSelector]) {
return father;
}
else {
return [super forwardingTargetForSelector:aSelector];
}
}
@end
[[GrandFather new] goToXiShi]; 结果 会是老子去参加 不过也算合理 一家人一个代表就可以了
========================================
第3种情况
老子一会要去打麻将 三缺一 都说好了的 放人家鸽子不太好 就跟自己的儿子说 你去吧 我有事 此时引入 第三个类
@interface Son : NSObject
- (void)goToXiShi;
@end
@implementation Son
- (void)goToXiShi {
NSLog(@"儿子自己去参加");
}
@end
GrandFather稍作修改
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
NSString * selString = NSStringFromSelector(aSelector);
if ([selString isEqualToString:@"goToXiShi"]) {
return [NSMethodSignature signatureWithObjCTypes:"v@:"];
}
else {
return [super methodSignatureForSelector:aSelector];
}
}
- (void)forwardInvocation:(NSInvocation *)anInvocation {
SEL selector = [anInvocation selector];
Son*son = [[Son alloc] init];
if ([son respondsToSelector:selector]) {
[anInvocation invokeWithTarget:son];
}
else {
[super forwardInvocation:anInvocation];
}
}
[[GrandFather new] goToXiShi]; 结果 会是儿子去参加
以上基本是消息转发的流程 逗比之处请大家原谅