performSelector详解

在项目中,常常用到performSelectorXXX之类的方法,而且有很多类似方法;今天就来召集一下!

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相关推荐

  1. iOS多线程中performSelector: 和dispatch_time的不同

    iOS中timer相关的延时调用,常见的有NSObject中的performSelector:withObject:afterDelay:这个方法在调用的时候会设置当前runloop中timer,还有 ...

  2. 关于 performSelector 的一些小探讨

    本文首发在我的个人博客: blog.shenyuanluo.com,喜欢的朋友欢迎订阅. 考虑以下代码,最终会输出什么? 例子①: - (void)viewDidLoad {[super viewDi ...

  3. performSelector may cause a leak because its selector is unknown

    转自:http://www.jianshu.com/p/6517ab655be7 问题 我在 ARC 模式下编译出了这个 warning: "performSelector may caus ...

  4. [Xcode 实际操作]八、网络与多线程-(19)使用RunLoop使PerformSelector方法延迟动作的执行...

    目录:[Swift]Xcode实际操作 本文将演示使用RunLoop使PerformSelector方法延迟动作的执行. 在项目导航区,打开视图控制器的代码文件[ViewController.swif ...

  5. 初探swift语言的学习笔记十一(performSelector)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/35842441 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...

  6. Objective-C中一种消息处理方法performSelector: withObject:

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

  7. NSObject中的performSelector用法简介

    - (id)performSelector:(SEL)aSelector Description [说明] Sends a specified message to the receiver and ...

  8. iOS 网络与多线程--7.Performselector消息处理方法

    创建一个IOSApp类 IOSApp.h文件 1 #import <Foundation/Foundation.h> 2 3 @interface IOSApp : NSObject 4 ...

  9. performSelector:withObject:afterDelay: 精要概览(持续更新)

    - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay; - ...

  10. 如何在延迟后触发一个块,比如-performSelector:withObject:afterDelay:?

    有没有办法在延迟后调用带有原始参数的块,比如使用performSelector:withObject:afterDelay:但是使用像int / double / float这样的参数? #1楼 Bl ...

最新文章

  1. linux命令全集,Linux命令全集
  2. 洛谷 深基 第1部分 语言入门 第4章 循环结构程序设计(2022.02.14)
  3. java 虚拟机内存管理_java虚拟机内存管理
  4. C51指针定义和应用小结
  5. 教你如何优雅的改写“if-else”
  6. C语言之结构体(2)
  7. IOS 获取系统通讯录中的联系人信息
  8. 黄聪:wordpress教程
  9. 太阳能计算机屏幕是什么材质,电脑显示器表面是什么材质的 什么是液晶玻璃...
  10. Java基于Socket实现简单QQ聊天详细教程
  11. 如何检测分布式系统中的故障节点
  12. 高职高专教材出版发行市场乱象丛生——来自中青报的报道【转】
  13. Linux/ubuntu下卸载软件
  14. 20150128-堆雪人
  15. 2023该好好赚钱了,推荐三个下班就能做的副业
  16. Django部署 阿里云CentOS 8+Nginx+uWsgi
  17. 视频转文字怎么转,3个办法教你将视频里的语音转文字
  18. 【移动终端应用开发】实验1:SharedPreferences的应用
  19. Android-触感反馈和声音反馈的效果实现
  20. 画频率响应和零极点图MATLAB,LTI系统频率响应的Riemann 图和地图投影图的MATLAB函数实现...

热门文章

  1. excel单元格设置下拉列表
  2. 用unity做游戏用java_Unity游戏开始崩溃
  3. 一个工科生对财富认知初探
  4. WTF Solidity极简入门: 35. 荷兰拍卖
  5. 购买计算机配件时需要考虑什么因素,哪些配置和参数是购买和组装计算机的主要因素?阅读后您会理解的!...
  6. 小程序界面开发实现各种机型自适应
  7. Redisson实现分布式锁(3)—项目落地实现
  8. oracle asp.net上传 下载 文件大小只有32kb,asp默认上传大小
  9. 在excel表格里输入数据后左上角会出现绿色的小标签
  10. 输出1900-2000年中是闰年的年份