PerformSelector
PerformSelector
1. 执行和取消
//执行
[self performSelector:@selector(showMessage) withObject:nil afterDelay:]; //取消
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showMessage) object:nil];
(1)PerformSelector与直接调用的区别
performSelector是运行时系统负责去找方法的,在编译时候不做任何校验;如果直接调用编译是会自动校验。如果上面例子中showMessage不存在,则performSelector方法会运行时崩溃。所以,使用performSelector方法之前,应该使用方法- (BOOL)respondsToSelector:(SEL)aSelector;进行安全检查,以保证程序的健壮性。
(2) performSelector与RunLoop
RunLoop有两种输入源:基于端口的输入源和自定义输入源。performSelector就是属于自定义输入源。使用performSelector时,就会把相应事件加到线程对应的RunLoop里进行管理。
(3) 取消performSelector
对于 [performSelector:withObject: afterDelay:];方法,afterDelay的时间设置后,performSelector的执行不会因为当前的viewController的灭亡而取消执行,因此需要在合适的时机cancel掉前面的PerformRequests。
2. 在主线程执行的方法
(1)performSelector在主线程执行
-(void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullableid)arg waitUntilDone:(BOOL)wait;
wait:指示要执行的aSelector方法是否马上执行。
如果设置为YES:等待当前线程执行完以后,主线程才会执行aSelector方法;
设置为NO:不等待当前线程执行完,就在主线程上执行aSelector方法。
如果当前线程就是主线程,无论设置为YES还是NO,aSelector方法都会马上执行。
(2)GCD的dispatch_async方法
dispatch_async(dispatch_get_main_queue, ^{
// do something
});
PerformSelector的更多相关文章
- iOS 消息处理之performSelector
//// RootViewController.h// DSCategories//// Created by dasheng on 15/12/17.// Copyright © 2015年 ...
- iOS多线程中performSelector: 和dispatch_time的不同
iOS中timer相关的延时调用,常见的有NSObject中的performSelector:withObject:afterDelay:这个方法在调用的时候会设置当前runloop中timer,还有 ...
- performSelector和respondsToSelector用法
一.performSelector调用和直接调用区别 下面两段代码都在主线程中运行,我们在看别人代码时会发现有时会直接调用,有时会利用performSelector调用,今天看到有人在问这个问题,我便 ...
- performSelector的原理以及用法
一.performSelector调用和直接调用区别下面两段代码都在主线程中运行,我们在看别人代码时会发现有时会直接调用,有时会利用performSelector调用,今天看到有人在问这个问题,我便做 ...
- 手写一个更好用的performSelector/msgSend(详细修改版)
这其实是一个NSInvocation练习作业 GitHub源码 vk_msgSend 引子 工作中难免会遇到一些场景,开发的时候不想引入整个头文件,但是又想调用一些方法 动态创建,动态调用看起来比较酷 ...
- performSelector:withObject:afterDelay: 精要概览(持续更新)
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay; - ...
- objective-c "performSelector may cause a leak because its selector is unknown".
#define SuppressPerformSelectorLeakWarning(Stuff) \ do { \ _Pragma("clang diagnostic push" ...
- ios之"performSelector may cause a leak because its selector is unknown"警告原因及其解决办法
问题描述 项目中使用到了从字符串创建选择器,编译时发现警告:"performSelector may cause a leak because its selector is unknown ...
- warning:performSelector may cause a leak because its selector
warning:performSelector may cause a leak because its selector 在ARC项目中使用 performSelector: withObj ...
随机推荐
- 严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderLis
一个让我崩溃的问题 感谢:http://blog.csdn.net/itlionwoo/article/details/17523371
- 腾讯QQ形象18年变迁史,最早的QQ企鹅形象居然长这样!
1999年,腾讯创建之初,这是当时QQ的形象,现在看起来很滑稽,又高又瘦.当时公司并没有专职的设计师,所以这个形象就凑合着用了. 后来,腾讯也觉着上一个形象做的不是特别好,于是在2000年的时候,公司 ...
- 【XLL 框架库函数】 TempInt/TempInt12
创建一个包含了 integer 的 XLOPER/XLOPER12 原型 LPXLOPER TempInt(short int i); LPXLOPER12 TempInt12(int i); 参数 ...
- Android 小笔记
<!-- xml --> android:visibility="gone" 可以隐藏 元素 xmlns:bootstrapbu ...
- iOS TabeView 头视图和尾视图不滑动的实现
因项目有需求不能让section中的头尾视图滑动,顾根据网上的一些资料和自己整理的思路,已实现了不滑动效果,上代码,啥都说了,搞了2个小时都是泪.... 1.创建一个tableview _mainTa ...
- java 注解 + 自定义注解的使用
java中元注解有四个: @Retention @Target @Document @Inherited: @Retention:注解的保留位置 @Retention(RetentionPolicy ...
- hive2.1.0安装
下载hive(http://mirrors.cnnic.cn/apache/hive/) 或者 http://archive.apache.org/dist/hive/(hive历史版本) 在本地进行 ...
- IBatis和Hibernate区别
1. 简介 Hibernate是当前最流行的O/R mapping框架.它出身于sf.net,现在已经成为Jboss的一部分了.iBATIS是另外一种优秀的O/R mapping框架,现已改名叫myB ...
- SpringMVC学习(二)
SpringMVC入门(注解方式) 需求 实现商品查询列表功能. 第一步:创建Web项目 springmvc02 第二步:导入jar包 第三步:配置前端控制器 在WEB-INF\web.xml中配置前 ...
- sprintf溢出的bug
向printf.sprintf这种函数在编译时很难检查错误,所以程序员必须小心.比如我就遇到了这样的bug: void test() { ]; sprintf(t,"); } //执行spr ...