博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Objective-C中一种消息处理方法performSelector: withObject:
阅读量:6950 次
发布时间:2019-06-27

本文共 2596 字,大约阅读时间需要 8 分钟。

摘要: Objective-C中调用函数的方法是消息传递,这个和普通的函数调用的区别是,你可以随时对一个对象传递任何消息,而不需要在编译的时候声明这些方法。所以Objective-C可以在runtime的时候传递人和消息。首先介绍两个方法。

Objective-C中调用函数的方法是“消息传递”,这个和普通的函数调用的区别是,你可以随时对一个对象传递任何消息,而不需要在编译的时候声明这些方法。所以Objective-C可以在runtime的时候传递人和消息。

 

首先介绍两个方法 SEL和@selector

根据Apple官方文档这个传递消息的函数就是 id objc_msgSend(id theReceiver, SEL theSelector, …)

theReceiver是接受消息的对象类型是id,theSelector是消息名称类型是SEL。下边代码我们来看看如何来生成一个SEL,如果传递消息。

首先建立一个简单的函数

- (void) fooNoInputs {

NSLog(@"Does nothing");

}

然后调用它

[self performSelector:@selector(fooNoInputs)];

第二个试验看看如何在消息中传递参数

我们建立一个有input参数的函数

- (void) fooOneIput:(NSString*) first {

NSLog(@"Logs %@", first);

}

然后调用它

[self performSelector:@selector(fooOneInput:) withObject:@"first"];

第三个试验更多的参数

- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second {

NSLog(@"Logs %@ then %@", first, second);

}

然后调用它

[self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first"withObject:@"second"];

第四个试验如何建立动态的函数,然后调用他们?我们需要建立一个selector

SEL myTestSelector = @selector(myTest:);

并且我们调用的函数在另外一个Class内

- (void)abcWithAAA: (NSNumber *)number {

int primaryKey = [number intValue];

NSLog("%i", primaryKey);

}

MethodForSelectors * mfs = [MethodForSelectors alloc];

NSArray *Arrays = [NSArray arrayWithObjects:@"AAA", @"BBB", nil];

for ( NSString *array in Arrays ){

SEL customSelector = NSSelectorFromString([NSStringstringWithFormat:@"abcWith%@:", array]);

mfs = [[MethodForSelectors alloc] performSelector:customSelector withObject:0];

}

完整的代码:

@implementation ClassForSelectors

- (void) fooNoInputs {

NSLog(@"Does nothing");

}

- (void) fooOneIput:(NSString*) first {

NSLog(@"Logs %@", first);

}

- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second {

NSLog(@"Logs %@ then %@", first, second);

}

 

- (NSArray *)abcWithAAA: (NSNumber *)number {

int primaryKey = [number intValue];

NSLog("%i", primaryKey);

}

 

- (void) performMethodsViaSelectors {

[self performSelector:@selector(fooNoInputs)];

[self performSelector:@selector(fooOneInput:) withObject:@"first"];

[self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first"withObject:@"second"];

}

 

- (void) performDynamicMethodsViaSelectors {

MethodForSelectors * mfs = [MethodForSelectors alloc];

NSArray *Arrays = [NSArray arrayWithObjects:@"AAA", @"BBB", nil];

for ( NSString *array in Arrays ){

SEL customSelector = NSSelectorFromString([NSStringstringWithFormat:@"abcWith%@:", array]);

mfs = [[MethodForSelectors alloc] performSelector:customSelector withObject:0];

}

}

@end

 
@implementation MethodForSelectors

- (void)abcWithAAA: (NSNumber *)number {

NSLog("%i", number);

}

@end

转载地址:http://gyuil.baihongyu.com/

你可能感兴趣的文章
靠播放业务吃不饱?音乐流媒体纷纷“加电商”卖周边
查看>>
SSL之父称SSL不会因被攻击而失去生命力
查看>>
解读对象存储九大关键特征
查看>>
重构计算力 浪潮M5新一代服务器闪耀登场
查看>>
品高云产品经理邱洋:做国内云计算第一品牌
查看>>
大数据挑战:敢不敢不要加入人的判断?
查看>>
2014中国高校SAS数据分析大赛拉开帷幕
查看>>
何谓可穿戴数据中心
查看>>
云计算最有利于中小企业
查看>>
TP-Link C2和C20i产品出现命令注入、DoS等多个漏洞 绿盟科技发布安全威胁通告
查看>>
IDC:“互联网+流通”将进一步释放活力
查看>>
IT 史上那些不为人知的第一次
查看>>
VR厂商,你们考虑过霍金的感受吗?
查看>>
大数据框架对比:Hadoop、Storm、Samza、Spark和Flink
查看>>
网络安全联盟推进威胁情报共享的扩张
查看>>
5G商业化进程提速 运营商推进网络智能化转型
查看>>
数据中心效率:40%的改进是通过最佳实践方案
查看>>
编写可靠shell脚本的8个建议
查看>>
李瑾博士:信誉的建立是否“不计成本”?
查看>>
域渗透TIPS:获取LAPS管理员密码
查看>>