运行时runtimeIOSiOS开发 技术集锦

runtime - 消息发送(objc_msgSend)

2016-07-04  本文已影响1821人  啊啊啊啊锋

在OC中,我们对方法的调用都会被转换成内部的消息发送执行对objc_msgSend方法的调用,掌握好消息发送,可以让我们在编程中更方便灵活。

首先来看下方法定义:

/**  定义:'为某个类对象发送消息,并且返回一个值' 
    参数1: 消息接收的对象实例 
    参数2: 要执行的方法 
     ...: 一系列其他参数 */
id objc_msgSend(id self, SEL op, ...) 

这里有官方文档的解释

我们创建一个MessageSendTest文件,在.m文件中定义四个方法用于测试:

// 无参数 无返回值
- (void)noArgumentsAndNoReturnValue
{
    NSLog(@"方法名:%s", __FUNCTION__);
}

// 带一个参数 无返回值
- (void)hasArguments:(NSString *)arg
{
    NSLog(@"方法名:%s, 参数:%@", __FUNCTION__, arg);
}

// 无参数 有返回值
- (NSString *)noArgumentsButReturnValue
{
    NSLog(@"方法名:%s, 返回值:%@", __FUNCTION__, @"不带参数,但是带有返回值");
    return @"不带参数,但是带有返回值";
}

// 带两个参数 有返回值
- (int)hasArguments:(NSString *)arg andReturnValue:(int)arg1
{
    NSLog(@"方法名:%s, 参数:%@, 返回值:%d", __FUNCTION__, arg, arg1);
    return arg1;
}

然后我们再定义一个测试方法:

+ (void)test
{
}

在测试方法里边,我们:

备注

在使用objc_msgSend方法编译时可能出现报错的情况,对应的解决办法如下:

本篇笔记部分参考自一下:

Demo地址

上一篇 下一篇

猜你喜欢

热点阅读