1、NSRUnLoop是消息机制的处理模式
NSRunLoop的作用在于有事情做的时候使得当前NSRunLoop的线程工作,没有事情做让当前NSRunLoop的线程休眠。
2、NSTimer默认添加到当前NSRunLoop中,也可以手动指定添加到自己创建的NSRunLoop中
1)、[NSTimer schduledTimerWithInterval:target:selector:userInfo:repeats:] 默认添加到当前NSRunLoop中
2)、NSTimer *timer = [NSTimer timerWithTimeInterval:invocation:repeats]
NSTimer *timer = [[NSTimer alloc] initWithFireDate:];
创建timer [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes],timer释放
3、NSRunLoop就是一直循环检测,从线程start到线程end,检测inputsource(如点击,双击等操作)同步事件,检测timesource同步事件,检测到输入源会 执行处理函数,首先会产生通知,corefunction向线程添加runloop observers来监听事件,意在监听事件发生时来做处理
4、runloopmode是一个集合,包括监听:事件源,定时器,以及需要通知的runloop observers
模式包括:
default模式:几乎包括所有输入源(除NSConnection)NSDefaultRunLoopMode模式
mode模式:处理model panels
connection模式:处理NSConnection事件,属于系统内部,用户基本不用
event tracking模式:如组件推动输入源UITrackingRunLoopModes不处理定时事件
common modes模式:NSRunLoopCommonModes这是一组可配置的通用模式。将input sources与该模式关联则同时也将input sources与该组中的其 他模式进行关联
每次运行一个run loop,指定run loop的运行模式。当相应的模式传递给run loop时,只有与该模式对应的input sources才被监控并允许run loop对事 件进行处理
如:
1)、在timer与table同时执行情况,当拖动table时,runloop进入UITrackingRunLoopModes模式下,不会处理定时事件,此时timer不能处理,所以 此时将timer加入到NSRunLoopCommonModes模式下
2)、在scroll一个页面时来松开,此时connection不会收到消息,由于scroll时runloop为UITrackingRunLoopModes模式,不接收输入源,此时要修 改connection的mode
[scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]
5、关于-(BOOL)runMode:(NSString *)mode beforeDate:(NSDate *)date方法
指定runloop模式来处理输入源,收个输入源或date结束退出。
暂停当前处理的流程,转而处理其他输入源,当date设置为[NSDate distantFucture](将来,基本不会达到的时间),所以除非处理其他输入源结束, 否则永不退出处理暂停的当前处理的流程
6、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。
7、performSelector关于内存管理的执行原理是这样的,[self performSelector:@selector(method1:)withObject:self.tableLayer afterDelay:3]的时候,系统会将tableLayer的引用计数加1,执行完这个方法时,还会将tableLayer的引用计数减1,由于延迟这时tableLayer的引用计数没有减少到0,也就导致了切换场景dealloc方法没有被调用,出现了内存泄露
利用如下方法:
[NSObject cancelPreviousPerformRequestsWithTarget:self]
机上这个以后,顺利执行dealloc方法。