runtime消息发送
2017-03-10 10:08
197 查看
一、runtime简介
RunTime简称运行时。OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制。对于C语言,
函数的调用在编译的时候会决定调用哪个函数。对于OC的函数,属于
动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。
1.发送消息
OC方法的调用就是让对象发消息,objc_msgSend()方法就是 用来发送消息的,Permissions *p = [[Permissions alloc] init];
[p waitUrgeOrder];其实最后会转成
objc_msgSend(p,@selector(waitUrgeOrder));
如果有参数后面也可填入参数
SEL sel = @selector(alertWithString:); objc_msgSend([Tools class], sel, @"参数");
最近在ios8时,发现如下报错:
Too many arguments to function call, expected 0, have 3
解决方法
((void (*)(id, SEL, id))(void *) objc_msgSend)((id)[Tools class], sel, @"参数");
objc_msgSend(receiver, selector, arg1, arg2, ...)
参数:receiver 接受对象
selector 方法选择器
arge1 参数
例如:
创建类 Tools
.h中有个弹窗方法 需要传人参数str
#import <Foundation/Foundation.h> @interface Tools : NSObject +(void)alertWithString:(NSString *)str; @end.m
#import "Tools.h" @implementation Tools +(void)alertWithString:(NSString *)str { UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"提示" message:str delegate:nil cancelButtonTitle:@"确定" otherButtonTitles: nil]; [alert show]; } @end
其他类中调用
- (instancetype)init { self = [super init]; if (self) { [Tools alertWithString:@"111"]; SEL sel = @selector(alertWithString:); ((void (*)(id, SEL, id))(void *) objc_msgSend)((id)[Tools class], sel, @"你好runtime"); } return self; }最终效果为
技术有限 如有什么不对的地方 希望大牛 能多多指导!!!!
相关文章推荐
- 从发送一个消息(调用一个方法)来说 Runtime
- Runtime 一一 runtime作用-发送消息
- java.lang.RuntimeException: 将消息发送到死的线程上处理程序的处理程序 (android.os.Handler)
- runtime从入门到精通(五)—— 消息发送和消息转发
- runtime - 消息发送(objc_msgSend)
- 初识 Runtime机制 - 发送消息
- runtime1 - 消息发送机制
- iOS_Runtime1_消息发送机制
- 神经病院Objective-C Runtime住院第二天——消息发送与转发
- [Runtime]-发送消息
- 简谈runtime运行机制之消息发送与转发
- 神经病院Objective-C Runtime住院第二天——消息发送与转发
- [置顶] iOS runtime 之消息发送机制三次拯救机会
- 微信支付java版本之JSAPI支付+发送模板消息
- MFC使用SendMessage()发送自定义消息实现进程间通信
- Unity3D 研究院之IOS高级界面发送消息与Unity3D消息的接收
- Java与微信不得不说的故事——消息的接收与发送
- 公众号用户发送消息后台PHP回复没有反应的解决办法
- Objective-C runtime之消息(二)
- 第二人生的源码分析(三十八)构造一个消息包并发送