消息式VS函数式

163 阅读2分钟

今天的感觉东西不是很多 让我来稍微说一下

函数式的语言好比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]; 结果 会是儿子去参加 

以上基本是消息转发的流程 逗比之处请大家原谅