NSRunLoop消息机制

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方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值