泰罗奥特曼,iOS开发之-NSInvocation,正当防卫3

频道:推荐新闻 日期: 浏览:234

简介

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

最底层的转发函数为objc_msgSend。

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

  • 在 ARC 场景下 performSeldoubles~刑警二人组ector 可能会形成内存走漏
  • performSelector 至多接纳 2 个参数,假如参数剩余 2 个,咱们泰罗奥特曼,iOS开发之-NSInvocation,正当防卫3就无法运用 performSelector 来向方针发送音讯了。
  • performSelector 约束参数类型为 id,以标量数据(int double NSInteger 等)为参数的办法运用 performSelector 调用会呈现各式各样怪异的问题

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

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

NSInvocation 的运用

运用过程:

创立办法创立签名方针NSMe俞渭波thodSigna性动作ture
依据签名方针创立调用NSInvocation
设置调用方针相关信息
调用办法
获取返回值
无参数、无返回值

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

- (void)startTest_Imple
{
// 获取办法签名
NSMethodSignature *signature = [[self class] instan泰罗奥特曼,iOS开发之-NSInvocation,正当防卫3ceMeth肉番少女odSignatureForSelector:@selector(startTes诺之克渔轮t)];
// 生成调用方针
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
// 设置target
invocationunnies.老公不卸职target = self;
// 设置办法完成
invocation.selector = @s上海鸿凯投资有限公司elector(startTest);
// 调用
[invocation invoke];
}

- (void)startTest
{
NSLog(@"无参数、无返王霸之气最强者龙傲天回值:startTest_1");
}

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

- (void)泰罗奥特曼,iOS开发之-NSInvocation,正当防卫3startTest_Imp泰罗奥特曼,iOS开发之-NSInvocation,正当防卫3le_3
{
// 获取办法签名
NSMethodSignature *signature = [ViewController instanceMethodSignatu巴洛克防地reForSelector:@selector(startTest_3:text1:)];
// 生成调用方针
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
// 设置target
invocation.target = self;
// 设置办法完成
invocation.sel泰罗奥特曼,iOS开发之-NSInvocation,正当防卫3ector = @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];
NSString *returnValue = nil;
[invocation getReturnValue:&returnValue]妈妈爱上我;
NSLog(@"返回值:%@",returnValue);
}
- (NSString *)star创盟易购tTest_3:(NSString *)text text1:(NSString *)text1
{
NSLog(@"参数%@--%@,无返回值:startTest_1",text,text1);
return @"返回值";
}

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

- (v泰罗奥特曼,iOS开发之-NSInvocation,正当防卫3oid)viewDidLoad {
[super viewDidLoad];
//NSInvocation;用来包装办法和对应的方针,它能够存储办法的称号,对应的方针,对应的参数,
/*
NSMethodSignature:签名:再创立NSMethodSignature的时分,有必要传递一个签名方针,签名方针的效果:用于获取参数的个数和办法的返回值
*/
//创立泰罗奥特曼,iOS开发之-NSInvocation,正当防卫3签名方针的时分不是运用NSMethodSignature这个类创立,而是办法归于谁就用谁来创立
NSMethodSignature*signature = [ViewController instanceMethodSignatureForSelector:@selector(sendMessageWithNumber:WithContent:)];

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

invocation.target = self;

//invocation中的办法有必要和土匪张平签名中的办法共同。
invocation.selecto蛋挞王子一号店r = @selector(sendMessageWithNumber:WithContent:);

/*第一个参数:需求给指定办法传递的值
第一个参数需求接纳一个指针,也便是传递值的时分需求传递地址*/
//第二个参数:需求给指定办法的第几个参数传值
NSString*number = @"1111";

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

NSString*number2 = @"啊啊啊";

[invocation setArgument:&number2 atIndex:3];

//2、调用NSInvocation移楼公司方针的invoke办法
//只需调用invocation的invoke办法,就代表需求履行NSInv古谱虫王蟋蟀排名ocation方针中拟定方针的指定方双将长牌法,而且传卖春递指定的参数
[invocation invoke];
}
- (void)sendMessageWithNumber:(NSString*)number WithContent:(NSString*)content{
NSLog(@"电话号%@,内容%@",number,content);
}

热门
最新
推荐
标签