一、使用方式

1.声明NSTimer方法
 
static CGFloat sIntervalTime = 15.f; //定时刷新时间间隔
@property (nonatomic, strong) NSTimer *queryNoticeTimer;
 
 
2.开启定时器,初始化定时器方法,注意一点是一定要先停止定时器判断,再开启,否则会出现内存泄漏哒,userInfo字段是传递数据时会用到,当调用定时器时候,需要传递参数时,可以生命userInfo方法。
- (void)startQueryTimer
{
    [self stopQueryTimer];
   
    if (nil == _queryNoticeTimer) {
        _queryNoticeTimer = [NSTimerscheduledTimerWithTimeInterval:sIntervalTimetarget:self
                                                           selector:@selector(headerAutoVoid)
                                                           userInfo:nilrepeats:YES];
    }
}
3.停止定时器,先判断下这个对象是否存在,存在的话释放内存,invalidate 负责将定时器从运行循环中移除,然后一定要将其设置为空指针操作,才能真正释放此对象
- (void)stopQueryTimer
{
    if (self.queryNoticeTimer) {
       
        [self.queryNoticeTimer invalidate];
        _queryNoticeTimer = nil;
    }
}
4.使用场景:让此页面定期刷新网络请求,这种情况需要在 生命周期 页面开启前加载定时器,然后在页面将要消失期间停止定时器,以防止内存泄漏,如下是页面使用定时器的方法
 
 
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    // 处理导航栏
    CGFloat distY = scrollView.contentOffset.y;
    [self.barView animateByOffsetY:distY];
   
    [self stopQueryTimer];
    [self startQueryTimer];
}
- (void)viewDidDisappear:(BOOL)animated
{
    [superviewDidDisappear:animated];
    [self stopQueryTimer];
}

- (void)viewDidAppear:(BOOL)animated
{
    [superviewDidAppear:animated];
   
    if (![_queryNoticeTimer isValid]) {
        [self startQueryTimer];
    }
}

 
- (void)releaseSelf
{
    [super releaseSelf];
   
    [self stopQueryTimer];
}
 
 
二、我的想法
 
定时器实现起来并不难,我用的是最简单的方法,OC中有五种方法来初始化定时器,这个方法不需要手动调用fair,会自动执行,并且自动加入主循环池,较为便捷,其他方法某些需要手动加入循环池,或者调用fair,很容易出现问题,能用简洁的方式解决,就不要用复杂的方法。定时器比较容易内存泄漏,所以控制内存泄漏是定时器需要注意的操作。
 
三、思考与行动:
 
1.这个定时器的原理是什么样的?为什么不能通过sleep()函数来模拟定时器,通过for循环来实现此功能?
 
2.iOS 的定时器和Android的定时器实现机制是否有区别?区别在哪里?为什么会有差异?
 
3.你用定时器的时候,踩到了哪些坑?这篇文还有哪些需要完善的地方?
 
4.分别通过5种OC的定时器方法来实现定时器功能,并讲述其区别。
 
 
 
 
 
 

最新文章

  1. .NET Core的文件系统[4]:由EmbeddedFileProvider构建的内嵌(资源)文件系统
  2. Linux内核笔记——进程管理之执行体
  3. 关于sizeof 跟strlen 的区别
  4. python easy_install pip django
  5. Node.js爬虫数据抓取乱码问题总结
  6. hdu 4604 Deque
  7. CSS3中的选择器
  8. 算法的优化(C语言描述)
  9. Java进阶代码
  10. flask开发restful api系列(8)-再谈项目结构
  11. 自动生成代码工具【JAVA版】
  12. linux驱动: 如何向模块传递参数, module_param和module_param_array
  13. android学习8(ListView高级使用)
  14. .Net程序员学用Oracle系列(22):分析函数(OVER)
  15. 给定了经纬度的一张my_latlng表,和一个my_grid表,怎么实现my_latlng表回mygrid中的id?
  16. 原生JS添加类名 删除类名
  17. Shell基础知识(四)
  18. spring之继承配置
  19. msf客户端渗透(一):payload利用简单示范
  20. VS新建API控制器时提示“运行所选代码生成器时出错”

热门文章

  1. WPF 触摸到事件
  2. C#--动态操作DataTable
  3. Redis入门手册
  4. 使用带ParserContext参数的Xaml.Load方法
  5. bash实现多进程运行
  6. wpf中的倒影效果实现
  7. WPF3D图片轮播效果
  8. matlab 工具函数(一) —— 添加指定 SNR 的噪声
  9. WPF太阳、地球、月球运动轨迹模拟
  10. (转)总结:JavaScript异步、事件循环与消息队列、微任务与宏任务