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

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

根据AppleObjective-C Runtime Reference官方文档这个传递消息的函数就是 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]init];

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];

}

注意:updated at 20120606

1.如果使用了ARC会产生“performSelector may cause a leak because its selector is unknown”警告
2.这种方式当传入一个不符合约定的消息时会继续运行并不报错。例如应该传入2个参数,但只传入1个参数。或传入了3个参数,第三个参数不会被初始化。

还有一种调用其他Class Function的方法是,但是不能有参数,我们这里假设没有参数,那么就可以这样

[mfs customSelector];

完整的代码:

@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

--EOF--
作者:Buro#79xxd 出处:http://www.cnblogs.com/buro79xxd/ 文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

Objective-C中一种消息处理方法performSelector: withObject:相关推荐

  1. HTTP请求方式中8种请求方法(简单介绍)

    HTTP请求方式中8种请求方法(简单介绍) 简单介绍 HTTP是超文本传输协议,其定义了客户端与服务器端之间文本传输的规范.HTTP默认使用80端口,这个端口指的是服务端的端口,而客户端使用的端口是动 ...

  2. ios中三种随机数方法

    ios 有如下三种随机数方法: //第一种 srand((unsigned)time(0)); //不加这句每次产生的随机数不变 int i = rand() % 5; //第二种 srandom(t ...

  3. mysql中两种备份方法的优缺点_Mysql两种存储引擎的优缺点

    MyISAM引擎是一种非事务性的引擎,提供高速存储和检索,以及全文搜索能力,适合数据仓库等查询频繁的应用.MyISAM中,一个table实际保存为三个文件,.frm存储表定义,.MYD存储数据,.MY ...

  4. oracle 中几种排序方法

    一.随机排序: select   *   from tablename order by dbms_random.value); 这种方法一般随机取前几行记录比较有用.对于10W以上的记录,采取抽样的 ...

  5. JavaWeb学习之路——SpringBoot 中几种异常处理方法(四)

    Spring Boot(三) 错误处理 1.自定义处理异常,返回指定界面 controller出现错误的方法中: @RequestMapping("/error")public S ...

  6. html 怎么使用http请求数据类型,HTTP请求方式中8种请求方法(简单介绍)

    HTTP工作原理 HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端.HTTP协议采用了请求/响应模型.客户端向服务器发送一个请求报文,请求报文包含请 ...

  7. asp.net ajax怎样传值,JQuery在asp.net中三种ajax传值

    1)通过webservice,注意去掉注释[System.Web.Script.Services.ScriptService]这行前的注释 2)通过aspx.cs文件中的静态方法 3)通过aspx文件 ...

  8. python隐藏部分代码_python隐藏类中属性的3种实现方法

    方法一: 效果图一: 代码一: # 定义一个矩形的类 class Rectangle: # 定义初始化方法 def __init__(self,width,height): self.hidden_w ...

  9. C语言结构体自动初始化实现,C语言中结构体(struct)的几种初始化方法

    本文给大家总结的struct数据有3种初始化方法 1.顺序 2.C风格的乱序 3.C++风格的乱序 下面通过示例代码详细介绍这三种初始化方法. 1)顺序 这种方法很常见,在一般的介绍C的书中都有介绍. ...

最新文章

  1. jquery file upload ajax上传图片 简单使用
  2. eclipse远程连接hadoop_1个文件,3个类,mapreduce就是这么简单,动手搭建Hadoop(8)...
  3. 5h是什么意思_2B铅笔中的2B是啥意思?
  4. think php getfield,thinkPHP数据查询常用方法总结【select,find,getField,query】
  5. 《AngularJS实战》——3.2 过滤器的应用
  6. linux命令之tee,linux tee命令
  7. 使用js调用dsoframer打开本地文档问题
  8. excel表用office2007一保存就闪退
  9. 如何找到属于自己高效学习方法?
  10. 实现Discord聊天机器人
  11. 随机森林——股票涨跌预测模型搭建
  12. Solidworks将英文菜单汉化
  13. linux7开放svn,CentOS 7 下SVN的安装及基础配置介绍
  14. SPARK 笔记 (五) 经纬度转换地址
  15. 搜索引擎高级搜索指令
  16. 损失函数、代价函数和目标函数的区别
  17. centos 7.6 —— Nginx 配置网页防盗链FPM参数优化
  18. mask-rcnn训练测试自制数据集
  19. 通过网络链接显示网页中的图片
  20. C++函数返回值和返回引用

热门文章

  1. 【推荐系统】推荐系统冷启动问题
  2. leetcode 刷题142 143
  3. 清华大学刘知远组:基于Prompt Tuning对低维本征任务子空间进行探索
  4. 慕尼黑工业大学最新综述:深度神经网络中的不确定性
  5. SIGIR 2021 | AutoDebias:推荐系统中通用的自动去偏方法
  6. IJCAI 2020 | 淡妆浓抹总相宜之人脸上妆
  7. BERT or XLNet,围观NLP巅峰烧钱大战。技术发展太快,如何才能跟得上节奏?
  8. 那个学Python的同龄人,也许已经超越你了!
  9. 图像压缩哪家强?请看这份超详细对比
  10. 深度学习中多层全连接网络的梯度下降法及其变式