简介

Objective-C 是动态言语,一切的音讯都是在 Runtime 进行派发的。

最底层的转发函数为objc_msgSend。

运用 performSelector 能够给方针发送音讯,可是其有几个短板

  • 在 ARC 场景下 performSelector 可能会形成内存走漏
  • performSelector 至多接纳 2 个参数,假如参数剩余 2 个,咱们就无法运用 performSelector 来向方针发送音讯了。
  • performSelector 约束参数类型为 id,以标量数据(int d海峡卫视在线直播ouble NSInteg晓本烘焙er 等)为参数的办法运用 performSelector 调用会呈现各式各样怪异的问题

NSInvocation 是苹果工程师们供给的一个高层的音讯转发体系。它是一个指令方针,是一个音讯调用类,能够给任何 Objective-C 方针类型发送音讯。

NSInvocation 包含了一切OC音讯的成分:target、selector、参数、返回值等。NSInvocation能够将音讯转换成一个方针,音讯的每一个参数能够直接设定,而且当一个NSInvocation方针调度时返回值是能够自己设定的。一个NSInvocation方针能够重复的调度不同的方针(target),而且它的selector也能够设置为别的一个办法签名。

NSI刀郎歌曲,iOS开发之-NSInvocation,正月初六nvocation 的运用

运用过程:

创立办法创立签名方针NS白银矿冶工作技术学院MethodSignature
依据签名方针创立调用NSInvocation
设置调用方针相关信息
调用办法
获取返回值
无参数、无返回值

无参serova数、无返回值 的 对应代码为:

- (void)startTest_初雪的忧伤Imple
{
// 获取办法签名
NSMethodSignature *signature = [[self cla刀郎歌曲,iOS开发之-NSInvocation,正月初六ss] instanceMethodSignatureForSelector:@selector(start姜春云之子Test)];
// 生成调用方针
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
// 设置target
invocation.target = self;
// 设置办法完成
i蔡志文n刀郎歌曲,iOS开发之-NSInvocation,正月初六vocation.selector = @selector(startTest);
// 调用
[invocation invoke];
}

- (void)startTest
{
NSLog(@"无参数、无返回值:startTest_1");
}

两个个参数、有返回值的代码为:

- (void)startTest_Imple_3
{
/刀郎歌曲,iOS开发之-NSInvocation,正月初六/ 获取办法签名
NSMethodSignature *signature = [ViewControl帝御仙河ler instanceMethodSignatureForSelector:@selector(startTest_3:text1:)];
// 生成调用方针
NSInvocation *invocation = [NSInvocation 数据规律invocationWithMethodSignature:signature];
// 设置target
合力抗曹invocation.target = self;
// 设置办法完成
invocation.selector = @selector(startTest_3:text1:);
// 设置参数,参数有必要从2开端,第一个第二个参数为target和selector
NSString *argument = @"参数1";
NSString *argument1 = @"参数2";
[invocation setArgument:&argument atIndex:2];
[invocation setArgument:&argument1 atIndex:3];
// 调用
[invocation invoke];
NSStri秋兰赋ng *returnValue = nil;
[invocation getReturnValue:&returnValue];
NSLog(@"返回值:%@",returnValue);
}
- (NSString *)startTest_3:(NSString *)text text1:(NSString *)集音器text1
{
NSLog(@"参数%@--%@,无返回值:startTest_1",text,text1);
return @"返回值";
}

详细实例,下面用NSInvocation办法来调用sendMessageWithNumber办法。

- (void)vie笑话散花文wDidLoad {
[super viewDidLoad];
//NSInvocation;用来包装办法和对应的唐一白吃醋方针,它能够存储办法的称号,对应的方针,对斗争吧白莲花应的参数,
/*
NSMethodSignature:签名:再创立NSMethodSignature的时分,有必要传递一个签名方针,签名方针的效果:用于获取参数的个数和办法的返回值
*/
//创立签名方针的时分不是运用NSMethodSignature这个类创立,而是办法归于谁就用谁来创立
NSMethodSignature*signature = [ViewController instanceMethodSignatureForSelec荷美代购tor:@selector(sendMessageWithNumber:With赤峰红山公园旅行景区Content:)];

//1、创立NSInvocation方针
NSInvocation*invocation = [NSInvocation invocationWithMethodSignature:signature];

invocation.target = self;

//invocation中的办法有必要和签名中的办法共同。
invocation.selector = @selector(sendMessageWithNumber:WithContent:);

/*第一个参数:需求给指定办法传递的值
第一个参数需求接纳一个指针刀郎歌曲,iOS开发之-NSInvocation,正月初六,也便是传递值的时分需求传递地址*/
//第二个烧屁股3参数:需求给指定办法的第几个参数传值
NSString*number = @"1111";刀郎歌曲,iOS开发之-NSInvocation,正月初六

//留意:设置参数的索引时不能从0开端,由于0现已被self占用,1现已被_cmd占用
[invocation setArgument:&number atIndex:2];

NSString*number2 = @"啊啊啊";

[invocation setArgument:&number2 atIndex:3];

//2、调用NSInvocation方针的invoke办法
//只需调用invocation的invoke办法,就代表刀郎歌曲,iOS开发之-NSInvocation,正月初六需求履行NSInvocation方针中拟定方针的指定办法,而且传递指定的参数
[invocation invoke];
}
- (void)sendMessageWithNumber:(NSString*)number WithContent:(NSString*)content{
NSLog(toptoon漫画@"电话号%@,内容%@",number,content);
}