发布网友 发布时间:2022-11-05 09:01
共1个回答
热心网友 时间:2023-10-06 04:34
在项目中,常常用到performSelector之类的方法,而且有很多类似方法;今天就来召集一下!
第一点 performSelector的使用
这里需要补充的知识:关于performSelector调用和直接调用方法的区别
1、performSelector是运行时系统负责去找方法的,在编译时候不做任何校验;如果直接调用编译是会自动校验。
如果methodNoParam、methodWithOneParam:、methodWithParams: andParamSecond:不存在
那么直接调用:在编译时候就能够发现(借助Xcode可以写完就发现),但是使用performSelector的话一定是在运行时候才能发现(此时程序崩溃);
Cocoa支持在运行时向某个类添加方法,即方法编译时不存在,但是运行时候存在,这时候必然需要使用performSelector去调用。
所以有时候如果使用了performSelector,为了程序的健壮性,会使用检查方法respondsToSelector。
2、直接调用方法时候,一定要在头文件中声明该方法的使用,也要将头文件import进来。而使用performSelector时候, 可以不用import头文件包含方法的对象,直接用performSelector调用即可。
3、performSelector是在iOS中的一种方法调用方式。他可以向一个对象传递任何消息,而不需要在编译的时候声明这些方法。所以这也是runtime的一种应用方式。
所以performSelector和直接调用方法的区别就在与runtime。直接调用编译是会自动校验。如果方法不存在,那么直接调用 在编译时候就能够发现,编译器会直接报错。
但是使用performSelector的话一定是在运行时候才能发现,如果此方法不存在就会崩溃。所以如果使用performSelector的话他就会有个最佳伴侣respondsToSelector:;来在运行时判断对象是否响应此方法。
备注:runtime???
在这小作总结:OC是运行时语言,只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方法。利用runtime机制让我们可以在程序运行时动态修改类、对象中的所有属性、方法,就算是私有方法以及私有属性都是可以动态修改的。
// 动态添加方法
// 开发场景:如果一个类方法非常多,加载了到内存的时候也比较耗费资源,需给每个方法生成映射表,可以使用动态给某个类,添加方法解决.
// 经典面试题:有没有使用preformSelector,其实主要想问有没有添加过方法;
performSelector相关的应用:传递三个及以上的参数
第一种:NSInvocation
第二种:把多个参数封装成一个参数
在这里不做描述:详情参考 https://my.oschina.net/ososchina/blog/644117
第三种:objc_msgSend
第二点
这里需要补充的知识:
Runloop 相当于 win32 里面的消息循环机制,它可以让你根据事件/消息(鼠标消息,键盘消息,触摸事件,计时器消息等)来调度线程。
比如:在触摸 UIView 时之所以能够激发 touchesBegan/touchesMoved 等等函数被调用。系统会自动为应用程序的主线程生成一个与之对应的 run loop 来处理其消息循环。让调用更加简单。也避免了繁琐,复杂的操作。
一句话:Runloop是一种消息处理机制!
参考链接:
http://www.jianshu.com/p/672c0d4f435a
http://blog.sina.com.cn/s/blog_7b9d64af0101bjw4.html
http://blog.csdn.net/meegomeego/article/details/20041887