文档章节

NSRunLoop详解

ericChen
 ericChen
发布于 2015/03/16 16:46
字数 1419
阅读 15728
收藏 9


1.NSRunLoop是IOS消息机制的处理模式 

NSRunLoop的主要作用:控制NSRunLoop里面线程的执行和休眠,在有事情做的时候使当前NSRunLoop控制的线程工作,没有事情做让当前NSRunLoop的控制的线程休眠。 

2.NSRunLoop 就是一直在循环检测,从线程start到线程end,检测inputsource(如点击,双击等操作)同步事件,检测timesource同步事件,检测到输入源会执行处理函数,首先会产生通知,corefunction向线程添加runloop observers来监听事件,意在监听事件发生时来做处理。 3.runloopmode是一个集合,包括监听:事件源,定时器,以及需通知的runloop observers 模式包括: 

default模式:几乎包括所有输入源(除NSConnection) NSDefaultRunLoopMode模式  mode模式:处理modal panels 

connection模式:处理NSConnection事件,属于系统内部,用户基本不用 

event tracking模式:如组件拖动输入源 UITrackingRunLoopModes 不处理定时事件  

common modes模式:NSRunLoopCommonModes 这是一组可配置的通用模式。将input sources与该模式关联则同时也将input sources与该组中的其它模式进行了关联。  

每次运行一个run loop,你指定(显式或隐式)run loop的运行模式。当相应的模式传递给run loop时,只有与该模式对应的 input sources才被监控并允许run loop对事件进行处理(与此类似,也只有与该模式对应的observers才会被通知) 

5.NSTimer默认添加到当前NSRunLoop中,也可以手动制定添加到自己新建的NSRunLoop的中 

[NSTimer schduledTimerWithTimeInterval: target:selector:userInfo:repeats]; 此方法默认添加到当前NSRunLoop中 

NSTimer *timer = [NSTimer timerWithTimeInterval: invocation:repeates:]; NSTimer *timer = [[NSTimer alloc] initWithFireDate:...]; 

创建timer  [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];  注意 timer的释放    

例: 

1). 在timer与table同时执行情况,当拖动table时,runloop进入UITrackingRunLoopModes模式下,不会处理定时事件,此时timer不能处理,所以此时将timer加入到NSRunLoopCommonModes模式(addTimer forMode) 

2).在滚动一个页面时来松开,此时connection不会收到消息,由于scroll时runloop为UITrackingRunLoopModes模式,不接收输入源,此时要修改connection的mode [scheduleInRunLoop:[NSRunLoop currentRunLoop]forMode:NSRunLoopCommonModes]; 6、子线程中的NSRunLoop需要手动启动,在子线程中使用timer要启动NSRunLoop。 7、关于-(BOOL)runMode:(NSString *)mode beforeDate:(NSDate *)date;方法 指定runloop模式来处理输入源,首个输入源或date结束退出。 

暂停当前处理的流程,转而处理其他输入源,当date设置为[NSDate distantFuture](将来,基本不会到达的时间),所以除非处理其他输入源结束,否则永不退出处理暂停的当前处理的流程。 8.while(A){ 

 [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];  } 

当前A为YES时,当前runloop会一直接收处理其他输入源,当前流程不继续处理,出为A为NO,当前流程继续 

9 、perform selector在thread中被序列化执行,这样就缓和了许多在同一个thread中运行多个方法所产生的同步问题。perform selector source在运行完selector后自动从run loop中移除。 当在非main thread中perform selector时,其thread中必须有一个激活的run loop。对于你自己创建的thread而言,只有你的代码显式的运行一个run loop后该perform selector才能得到执行。Run loop在当loop运行时处理所有已排队的perform selector,而不是在一个loop循环时只处理某一个perform selector。  

10.performSelector 关于内存管理的执行原理是这样的执

行 [self performSelector:@selector(method1:) withObject:self.tableLayer afterDelay:3]; 的时候,系统会将tableLayer的引用计数加1,执行完这个方法时,还会将tableLayer的引用计数减1,由于延迟这时tableLayer的引用计数没有减少到0,也就导致了切换场景dealloc方法没有被调用,出现了内存泄露。 利用如下函数: 

[NSObject cancelPreviousPerformRequestsWithTarget:self] 当然你也可以一个一个得这样用: 

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(method1:) object:nil] 


加上了这个以后,顺利地执行了dealloc方法  

在touchBegan里面 

[self performSelector:@selector(longPressMethod:) withObject:nil afterDelay:longPressTime] 然后在end 或cancel里做判断,如果时间不够长按的时间调用: 

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(longPressMethod:) object:nil] 

取消began里的方法  

**********************************以下是我在cocoachina中看到的一份总结 转载过来 线程实现的几种方式: 

1. Operation Objects   // NSOperation及相关子类 

2. *****                           // dispatch_async等相关函数 

3. Idle-time notifications  //  NSNotificationQueue,低优先级 3. Asynchronous functions  // 异步函数 4. Timers                      // NSTimer 5. Separate processes  // 没用过  

线程创建的成本: 

kernel data structures  约1KB 

Stack space             512KB(secondary threads)                                     1MB(iOS main thread) Creation time           约90 microseconds  

Run Loop和线程的关系: 

1. 主线程的run loop默认是启动的,用于接收各种输入sources 

2. 对第二线程来说,run loop默认是没有启动的,如果你需要更多的线程交互则可以手动配置和启动,如果线程执行一个长时间已确定的任务则不需要。  

Run Loop什么情况下使用: 

a. 使用ports 或 input sources 和其他线程通信   // 不了解 

b. 在线程中使用timers                                             // 如果不启动run loop,timer的事件是不会响应的  

c. 在Cocoa 应用中使用performSelector...方法   // 应该是performSelector...这种方法会启动一个线程并启动run loop吧 

d. 让线程执行一个周期性的任务                            // 如果不启动run loop, 线程跑完就可能被系统释放了  

注:timer的创建和释放必须在同一线程中。 

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];  此方法会retain timer对象的引用计数 


© 著作权归作者所有

ericChen
粉丝 3
博文 3
码字总数 2838
作品 0
福州
私信 提问
iPhone开发之NSRunLoop的进一步理解

iPhone应用开发中关于NSRunLoop的概述是本文要介绍的内容,NSRunLoop是一种更加高明的消息处理模式,他就高明在对消息处理过程进行了更好的抽象和封装,这样才能是的你不用处理一些很琐碎很低...

andyhe91
2014/04/14
753
1
【Runloop】深入理解原理和机制

用runloop解决cpu空转 runloop运行模式 了解设置模式 runloop在哪里 使用方法 换起runloop的三种方式 额外了解

创意总监
2016/06/01
614
0
NSRunloop,runloop,autoReleasePool和thread的关系理解及案例解决

1.NSRunloop NSRunloop顾名思义,就是一个消息循环,它会侦测输入源(input source)和定时源(timer source),然后做回调处理。这和windows的消息处理非常类似,只不过你无法看到类似SendMessa...

北方人在上海
2016/05/23
331
0
Objective-c中[signal sigabrt]问题

代码运行后出现下面的问题。 2014-10-30 23:18:45.673 L6-4Another[73662:2444037] -[Dog updateFromPath:]: unrecognized selector sent to instance 0x100409e40 2014-10-30 23:18:45.676 ......

xee
2014/10/31
2.6K
2
NSRunLoop&NSTimer混合使用

// // ViewController.m // NSRunLoop // // Created by JackMeng on 13-11-14. // Copyright (c) 2013年 JackMeng. All rights reserved. // #import "ViewController.h" @interface ViewCo......

浪子艾菲儿
2013/11/14
356
1

没有更多内容

加载失败,请刷新页面

加载更多

不就是SELECT COUNT语句吗,竟然能被面试官虐的体无完肤

数据库查询相信很多人都不陌生,所有经常有人调侃程序员就是CRUD专员,这所谓的CRUD指的就是数据库的增删改查。 在数据库的增删改查操作中,使用最频繁的就是查询操作。而在所有查询操作中,...

HollisChuang
27分钟前
4
0
乐观锁和悲观锁

乐观锁和悲观锁 在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性的问题 事务的特性:原子性、一致性、隔离性、持久性 1、丢失修改:T1和T2两个事务对同一个数据进行修改,T1先...

大瑞清_liurq
35分钟前
5
0
Scrum敏捷价值观与原则

Scrum是一种迭代式增量软件开发过程,通常用于敏捷软件开发。如果还不知道Scrum敏捷开发的朋友们,请出门左转,点击 Scrum 了解。 敏捷价值观 个体和互动 高于 流程和工具 工作的软件 高于 ...

醉美閑聖
35分钟前
4
0
android焦点

final RelativeLayout relativeLayout=new RelativeLayout(context); relativeLayout.setClickable(true); relativeLayout.setFocusable(true); rel......

安卓工程师王恒
37分钟前
4
0
IP地址分配与中继设备简介

1. TCP/IP模型 TCP/IP协议是在OSI参考模型出现之间就被开发的,并广泛部署在计算机网络中。但是,后来由于概念混淆,TCP/IP模型的层次和名称往往与OSI模型的层次名称相互借用。如图1.所示。 ...

xiangyunyan
39分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部