MessageSend:
1,在方法没有实现的时候不会报错,是因为OC运行时机制,在运行的时候才会动态监测,而c或者C++这类语言必须在定义的时候明确指明其类型,而不是等到运行过程动态监测,这类语言叫做静态语言
[cat play];
[cat playWithKid:@"zhangdanfeng"];
[IMCat play];
[IMCat playWithKid:@"zhangdanfeng"];
2,用稍微底层的方法performSeletor实现:
[cat performSelector:@selector(play)];
[cat performSelector:@selector(playWithKid:) withObject:@"zhangdanfeng"];
Class catClass = [cat class];
[catClass performSelector:@selector(play)];
[[IMCat class] performSelector:@selector(playWithKid:) withObject:@"zhangdanfeng"];
3,底层实际就是转成了messageSend方法,貌似iOS8之后底层方法被禁用了,如果需要打开,需要在Build Settings中禁用enable strict checking of Obj-c messageSend calls选项
objc_msgSend(cat, @selector(play));
objc_msgSend(cat, @selector(playWithKid:),@"zhangdanfeng");
objc_msgSend([IMCat class], @selector(play));
objc_msgSend([IMCat class], @selector(playWithKid:),@"zhangdanfeng");
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。