Cocoa触发方法调用的几种方法
每日更新关注:http://weibo.com/hanjunqiang
新浪微博
1.SEL触发
SEL就是selector的缩写,它表示Cocoa中的方法选择器,不明白?那请仔细了解Objective_C的运行时机制与Cocoa底层思想。
SEL theSelector = @selector(methodWithInt:andInt:);
看了上面代码这下你明白了什么是SEL了吧,平时我们开发当中经常用到的。
有了SEL这样就可以触发方法调用了,
[self performSelector:theSelector] [self performSelector:@selector(methodWithInt:andInt:)];
上面两句代码是同一个道理。
2. IMP触发
IMP其实就是一个函数指针的概念,就可以这么简单理解。
IMP theImplementation = [self methodForSelector:theSelector];
上面这句代码就是获取methodWithInt:andInt:这个方法的地址。
有了这个函数指针后,我们就可以触发方法:
theImplementation(self, theSelector, 30, 5);
第一个是对象,第二个SEL, 后面的传入的参数。
每日更新关注:http://weibo.com/hanjunqiang
新浪微博
3. objc_msgSend方法
这是Objc运行时的一个C方法,我们先看一个示列:
objc_msgSend(self, @selector(fly)); [self fly];
4. NSInvocation
NSInvocation相比上面几种方法,可以动态决定传入的参数个数。有了它,我们就可以实现…这样的变参API封装。
说得有点抽像,看代码更清楚:
假如我们实现了一个两个数相加的方法,
-(void)addNSNumber:(NSNumber *)first withNumber:(NSNumber *)second
我们可以用下面的方法来触发这个方法,并获取返回值。
NSNumber *arg1 = [NSNumber numberWithDouble:15.0]; NSNumber *arg2 = [NSNumber numberWithDouble:13.0]; SEL selector = @selector(addNSNumber:withNumber:); NSMethodSignature *sig = [self methodSignatureForSelector:selector]; NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; [invocation setTarget:self]; [invocation setSelector:selector]; [invocation setArgument:(void *)&arg1 atIndex:2]; [invocation setArgument:(void *)&arg2 atIndex:3]; [invocation invoke]; if ([sig methodReturnLength]) { [invocation getReturnValue:&retval]; return retval; } return nil; }
代码很容易理解,我也不多做解释,有不明白的请留言。
每日更新关注:http://weibo.com/hanjunqiang
新浪微博
下面是变参封装, 写了两个NSObject的Extension(Category):
|
调用方法:
|
每日更新关注:http://weibo.com/hanjunqiang
新浪微博
Cocoa触发方法调用的几种方法的更多相关文章
- struts调用的几种方法
在Struts2中方法调用概括起来主要有三种形式 第一种方式:指定method属性 <action name="student" class="com.itmyho ...
- Struts2方法调用的三种方式
在Struts2中方法调用概括起来主要有三种形式 第一种方式:指定method属性 <action name="student" class="com.itmyho ...
- Struts2方法调用的三种方式(有新的!调用方法的说明)
在Struts2中方法调用概括起来主要有三种形式 第一种方式:指定method属性 <action name="heroAction" class="com.ABC ...
- 第164天:js方法调用的四种模式
js方法调用的四种模式 1.方法调用模式 function Persion() { var name1 = "itcast", age1 = 19, show1 = functio ...
- QT下实现对Linux Shell调用的几种方法
使用QProcess QThread ============================================ #include <QProcess>int main(){ ...
- 【java】子类可以通过调用父类的public方法调用父类的private方法,为什么?
代码1: 打印结果: 代码2: 运行结果: 问题: 代码1中super是父类自己调用自己的add()方法,并在add()方法中调用了私有的del()方法,那为什么打印出来的this是子类? 代码2中t ...
- vue中触发键盘事件的两种方法和如何自定义键位事件,完整代码!
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Android延时执行调用的几种方法
一.开启新线程 new Thread(new Runnable(){ public void run(){ Thread.sleep(XXXX); ...
- php 递归调用又一种方法
public static function encodeXml($data){ $attr = $xml = ""; foreach($data a ...
随机推荐
- python基础(1)
1.python中三元表达式 类比于C.C++.Java中都有的三目运算符,python中使用下面语句实现三元表达式 true_part if condition else false_part. c ...
- 忘记Jenkins管理员密码的解决办法
一.admin密码未更改情况 1.进入\Jenkins\secrets目录,打开initialAdminPassword文件,复制密码: 2.访问Jenkins页面,输入管理员admin,及刚才的密码 ...
- KMP及其改进算法
本文主要讲述KMP已经KMP的一种改进方法.若发现不正确的地方,欢迎交流指出,谢谢! KMP算法的基本思想: KMP的算法流程: 每当一趟匹配过程中出现字符比较不等时,不需回溯 i 指针,而是利用已经 ...
- Java 并发编程——Executor框架和线程池原理
Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务 ...
- ftp传二进制文件时一定要用二进制模式,否则内容会有变化,造成后处理莫名其妙的错误,还以为传输前后内容一致,其实已变化。
ftp传二进制文件时一定要用二进制模式,否则内容会有变化,造成后处理莫名其妙的错误,还以为传输前后内容一致,其实已变化.
- CODEVS3269混合背包+二进制优化
codevs 3296 http://codevs.cn/problem/3269/ 题目描述 Description 背包体积为V ,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至 ...
- Go 语言条件语句
条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为 true 来决定是否执行指定语句,并在条件为 false 的情况在执行另外的语句. 下图展示了程序语言中条件语句的结构: Go 语言提供 ...
- MySQL系列教程(二)
mySQL执行计划 语法 explain <sql语句> 例如: explain select * from t3 where id=3952602; explain输出解释 +---- ...
- 加解密、PKI与CA基础
介绍 这门知识如果以前尝过的各位想必都知道:枯燥无比!因此在文中我会尽量讲的生动些,举一些例子,并试图以一个完整的例子来贯穿整个讲述过程.今年又恰逢莎翁逝世400周年,一方面也为了纪念这位伟大的作家. ...
- 学习TensorFlow,调用预训练好的网络(Alex, VGG, ResNet etc)
视觉问题引入深度神经网络后,针对端对端的训练和预测网络,可以看是特征的表达和任务的决策问题(分类,回归等).当我们自己的训练数据量过小时,往往借助牛人已经预训练好的网络进行特征的提取,然后在后面加上自 ...