iOS performSelector(参考)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS performSelector(参考)相关的知识,希望对你有一定的参考价值。

参考技术A

在项目中,常常用到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

iOS performSelector多参数传递解决方案以及objc_msgSend的使用注意事项

1.iOS performSelector多参数传递解决方案以及objc_msgSend的使用注意事项 https://blog.csdn.net/glt_code/article/details/77584683 iOS performSelector多参数传递解决方案 以及objc_msgSen

以上是关于iOS performSelector(参考)的主要内容,如果未能解决你的问题,请参考以下文章

iOS performSelector方法总结

iOS 消息处理之performSelector

performSelector "backgroundRefreshStatus" 在 iOS 7 上崩溃

iOS - 如何实现具有多个参数和 afterDelay 的 performSelector?

为啥在 iOS 中 performSelector:withObject:@YES 时总是得到 NO,这在 macOS 中有所不同?

iOS 私有 API performSelector 崩溃