消息循环NSRunLoop

NSRunLoop (消息循环)
RunLoop就是消息循环,每一个线程内部都有一个消息循环。
只有主线程的消息循环默认开启,子线程的消息循环默认不开启。

NSRunLoop的作用
1,保证程序不退出
2.负责处理输入事件
3.如果没有事件发生.会让程序进入休眠状态

事件源 : input Sources 输入源
Timer Source 定时源

消息循环使用
1.创建输入源(定时源)
2.指定事件源再循环中运行的模式.并加入循环

//创建时间源
  NSTimer *timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(task) userInfo:nil repeats:YES];

  //定时源加到消息循环中去
   [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

循环的模式 (只有当消息模式 与循环的模式 匹配的时候,消息运行)
 // NSDefaultRunLoopMode 默认模式下,拖动界面,计时器停止  最常用的循环模式
 // NSRunLoopCommonModes 多模式的状态,拖动界面,不影响计时器工作 一组模式的集合

 // 消息循环时模式
  // kCFRunLoopDefaultMode 定时器工作的模式(默认模式)
  // UITrackingRunLoopMode 拖动界面时的模式

1.创建消息
2.把消息放入循环,并指定消息运行的模式
3.在与循环的模式匹配的时候,消息运行

特点:子线程默认不开启消息循环,主线程默认开启消息循环。
子线程的 RunLoop默认是不开启的,而且不可以轻易开启,如果开启会形成死循环,然后不停地检测是否有事件发生,因此开启子线程的消息循环之后一定要关闭,防止程序挂掉,

子线程中的消息循环

 //开启子线程的消息循环
  //第一种方法 .无法停止
  //    [[NSRunLoop currentRunLoop] run];
  //第二种方法 .制定循环运行时间,
  [[NSRunLoop currentRunLoop]
      runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2]];
  //第三种方式 推荐方式
  //将shouldKeepRunning定义为全局的变量,并且设置为NO
  //  BOOL shouldKeepRunning = YES; // global
  NSRunLoop *theRL = [NSRunLoop currentRunLoop];
  NSLog(@"%d", shouldKeepRunning);
  while (shouldKeepRunning &&
         [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);

NSRunloop与autorelease pool
在主线程消息循环开始的时候创建自动释放池,在消息循环结束的时候,销毁释放池,
在循环过程中创建的临时对象,会自动添加到释放池中,在循环结束后会向池中所有对象发送 release 消息,释放所有 autorelease 对象,以减少内存消耗;
NSThread开启子线程的时候要自己创建自动释放池,否则会发生内存泄露

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值