关于performSelector
performSelector详解
1.performSelectorOnMainThread:withObject:waitUntilDone:
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait
在主线程上执行指定的方法,使用默认的模式(NSDefaultRunLoopMode)。
默认的模式指:主线程中的方法进行排队,是一个循环队列,并且循环执行。
参数:
aSelector:要在主线程执行的方法,该方法不能有返回值,并且只能有一个参数。
arg:要传递的参数,如果无参数,就设为nil
wait:要执行的aSelector方法,是否马上执行。
如果设置为YES:等待当前线程执行完以后,主线程才会执行aSelector方法;
设置为NO:不等待当前线程执行完,就在主线程上执行aSelector方法。
如果,当前线程就是主线程,那么aSelector方法会马上执行。
该方法用途:因为iPhone编程,对UI的修改,只能在主线程上执行。可以用该方法来完成UI的修改。
2.performSelector:withObject:afterDelay:
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay
在当前线程中执行指定的方法,使用默认模式,并指定延迟。
参数:
aSelector:指定的方法。含义同上,不在赘述。
anArgument:同上
delay:指定延迟时间(秒)。
3.performSelector
我们常常用到以下3个方法,分别为:
- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
首先,定义要调用的方法
- (void)methodNoParam{
NSLog(@"methodNoParam");
}
- (void)methodWithOneParam:(id)paramFirst{
NSLog(@"methodWithOneParam: %@", paramFirst);
}
- (void)methodWithParams:(id)paramFirst andParamSecond:(id) paramSecond{
NSLog(@"methodWithOneParam: %@,%@", paramFirst,paramSecond);
}
// 没有参数
BOOL isNoParam= [self.selfViewControllerDelegate respondsToSelector:@selector(methodNoParam)];
if (isNoParam) {
[self.selfViewControllerDelegate performSelector:@selector(methodNoParam)];
}
// 一个参数
BOOL isOneParam= [self.selfViewControllerDelegate respondsToSelector:@selector(methodWithOneParam:)];
if (isOneParam) {
[self.selfViewControllerDelegate performSelector:@selector(methodWithOneParam:) withObject:@"firsht"];
}
// 二个参数
BOOL isParams= [self.selfViewControllerDelegate respondsToSelector:@selector(methodWithParams: andParamSecond:)];
if (isParams) {
[self.selfViewControllerDelegate performSelector:@selector(methodWithParams: andParamSecond:)withObject:@"first" withObject:@"second"];
}
下面两段代码都在主线程中运行,我们在看别人代码时会发现有时会直接调用,有时会利用performSelector调用,今天看到有人在问这个问题,我便做一下总结,
[delegate imageDownloader:self didFinishWithImage:image];
[delegate performSelector:@selector(imageDownloader:didFinishWithImage:) withObject:selfwithObject:image];
1、performSelector是运行时系统负责去找方法的,在编译时候不做任何校验;如果直接调用编译是会自动校验。如果imageDownloader:didFinishWithImage:image:不存在,那么直接调用 在编译时候就能够发现(借助Xcode可以写完就发现),但是使用performSelector的话一定是在运行时候才能发现(此时程序崩溃);Cocoa支持在运行时向某个类添加方法,即方法编译时不存在,但是运行时候存在,这时候必然需要使用performSelector去调用。所以有时候如果使用了performSelector,为了程序的健壮性,会使用检查方法
- (BOOL)respondsToSelector:(SEL)aSelector;
2、直接调用方法时候,一定要在头文件中声明该方法的使用,也要将头文件import进来。而使用performSelector时候, 可以不用import头文件包含方法的对象,直接用performSelector调用即可。
关于performSelector相关推荐
- iOS多线程中performSelector: 和dispatch_time的不同
iOS中timer相关的延时调用,常见的有NSObject中的performSelector:withObject:afterDelay:这个方法在调用的时候会设置当前runloop中timer,还有 ...
- 关于 performSelector 的一些小探讨
本文首发在我的个人博客: blog.shenyuanluo.com,喜欢的朋友欢迎订阅. 考虑以下代码,最终会输出什么? 例子①: - (void)viewDidLoad {[super viewDi ...
- performSelector may cause a leak because its selector is unknown
转自:http://www.jianshu.com/p/6517ab655be7 问题 我在 ARC 模式下编译出了这个 warning: "performSelector may caus ...
- [Xcode 实际操作]八、网络与多线程-(19)使用RunLoop使PerformSelector方法延迟动作的执行...
目录:[Swift]Xcode实际操作 本文将演示使用RunLoop使PerformSelector方法延迟动作的执行. 在项目导航区,打开视图控制器的代码文件[ViewController.swif ...
- 初探swift语言的学习笔记十一(performSelector)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/35842441 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...
- Objective-C中一种消息处理方法performSelector: withObject:
Objective-C中调用函数的方法是"消息传递",这个和普通的函数调用的区别是,你可以随时对一个对象传递任何消息,而不需要在编译的时候声明这些方法.所以Objective-C可 ...
- NSObject中的performSelector用法简介
- (id)performSelector:(SEL)aSelector Description [说明] Sends a specified message to the receiver and ...
- iOS 网络与多线程--7.Performselector消息处理方法
创建一个IOSApp类 IOSApp.h文件 1 #import <Foundation/Foundation.h> 2 3 @interface IOSApp : NSObject 4 ...
- performSelector:withObject:afterDelay: 精要概览(持续更新)
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay; - ...
- 如何在延迟后触发一个块,比如-performSelector:withObject:afterDelay:?
有没有办法在延迟后调用带有原始参数的块,比如使用performSelector:withObject:afterDelay:但是使用像int / double / float这样的参数? #1楼 Bl ...
最新文章
- linux命令全集,Linux命令全集
- 洛谷 深基 第1部分 语言入门 第4章 循环结构程序设计(2022.02.14)
- java 虚拟机内存管理_java虚拟机内存管理
- C51指针定义和应用小结
- 教你如何优雅的改写“if-else”
- C语言之结构体(2)
- IOS 获取系统通讯录中的联系人信息
- 黄聪:wordpress教程
- 太阳能计算机屏幕是什么材质,电脑显示器表面是什么材质的 什么是液晶玻璃...
- Java基于Socket实现简单QQ聊天详细教程
- 如何检测分布式系统中的故障节点
- 高职高专教材出版发行市场乱象丛生——来自中青报的报道【转】
- Linux/ubuntu下卸载软件
- 20150128-堆雪人
- 2023该好好赚钱了,推荐三个下班就能做的副业
- Django部署 阿里云CentOS 8+Nginx+uWsgi
- 视频转文字怎么转,3个办法教你将视频里的语音转文字
- 【移动终端应用开发】实验1:SharedPreferences的应用
- Android-触感反馈和声音反馈的效果实现
- 画频率响应和零极点图MATLAB,LTI系统频率响应的Riemann 图和地图投影图的MATLAB函数实现...
热门文章
- excel单元格设置下拉列表
- 用unity做游戏用java_Unity游戏开始崩溃
- 一个工科生对财富认知初探
- WTF Solidity极简入门: 35. 荷兰拍卖
- 购买计算机配件时需要考虑什么因素,哪些配置和参数是购买和组装计算机的主要因素?阅读后您会理解的!...
- 小程序界面开发实现各种机型自适应
- Redisson实现分布式锁(3)—项目落地实现
- oracle asp.net上传 下载 文件大小只有32kb,asp默认上传大小
- 在excel表格里输入数据后左上角会出现绿色的小标签
- 输出1900-2000年中是闰年的年份