runtime消息发送

一、runtime简介

RunTime简称运行时。OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制。对于C语言,函数的调用在编译的时候会决定调用哪个函数。对于OC的函数,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。

1.发送消息

OC方法的调用就是让对象发消息,objc_msgSend()方法就是 用来发送消息的,


Permissions*p = [[Permissionsalloc]init];


[pwaitUrgeOrder];

其实最后会转成


objc_msgSend(p,@selector(waitUrgeOrder));

如果有参数后面也可填入参数


SELsel =@selector(alertWithString:);

objc_msgSend([Toolsclass], sel,@"参数");

最近在ios8时,发现如下报错:

Too many arguments to function call, expected 0, have 3

解决方法


((void(*)(id,SEL,id))(voidvoid*) objc_msgSend)((id)[Toolsclass], sel,@"参数");


objc_msgSend(receiver, selector, arg1, arg2, ...)

参数:receiver   接受对象

selector    方法选择器

arge1     参数

例如:

创建类 Tools

.h中有个弹窗方法 需要传人参数str


#import 

@interfaceTools : NSObject

+(void)alertWithString:(NSString*)str;

@end

.m

#import "Tools.h"

@implementationTools

+(void)alertWithString:(NSString*)str

{

UIAlertView* alert = [[UIAlertViewalloc]initWithTitle:@"提示"message:strdelegate:nilcancelButtonTitle:@"确定"otherButtonTitles:nilnil];

[alertshow];

}

@end

其他类中调用

- (instancetype)init

{

self= [superinit];

if(self) {

[ToolsalertWithString:@"111"];

SELsel =@selector(alertWithString:);

((void(*)(id,SEL,id))(voidvoid*) objc_msgSend)((id)[Toolsclass], sel,@"你好runtime");

}

returnself;

}

最终效果为

技术有限 如有什么不对的地方 希望大牛 能多多指导!!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,806评论 0 9
  • 在Objective-C中,使用 [receiver message] 语法并不会马上执行receiver对象的...
    Stago阅读 1,352评论 0 0
  • 在OC中,我们对方法的调用都会被转换成内部的消息发送执行对objc_msgSend方法的调用,掌握好消息发送,可以...
    啊啊啊啊锋阅读 9,891评论 5 12
  • 消息发送和转发流程可以概括为:消息发送(Messaging)是 Runtime 通过 selector 快速查找 ...
    lylaut阅读 5,872评论 2 3
  • 我和我的门 整夜都静立在你面前 按在把手上的掌心 微微沁着汗 门扺死对抗着 我狂奔而去的欲望 6501和6502 ...
    李榆阅读 3,060评论 7 5