iOS中的计时器

iOS开发面试攻略(KVO、KVC、多线程、锁、runloop、计时器) KVO & KVC KVO用法和底层原理 使用方法:添加观察者,然后怎样实现监听的代理 KVO底层使用了 isa-swizling的技术. OC中每个对象/类都有isa指针, isa 表示这个对象是哪个类的对象. 当给对象的某个属性注册了一个 observer,系统会创建一个新的中间类(intermediate class)继承原来的class,把该对象的isa指针指向中间类。 然后中间类会重写setter方法,调用setter之前调用willChangeValueForKey, 调用setter 阅读详情

   

    iOS中的计时器有两种 :

           

         一。

             @property (nonatomic,strong)CADisplayLink *displayLink;

    _miaoShua = [CADisplayLinkdisplayLinkWithTarget:selfselector:@selector(miaoshua)];//创建定时器   一秒刷60次

    [_miaoShuaaddToRunLoop:[NSRunLoopmainRunLoop]forMode:NSRunLoopCommonModes];//加             入事件循环

   

    CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器。我们在应用中创建一个新的 CADisplayLink 对象,把它添加到一个runloop中,并给它提供一个 target 和selector 在屏幕刷新的时候调用。

    一但 CADisplayLink 以特定的模式注册到runloop之后,每当屏幕需要刷新的时候,runloop就会调用CADisplayLink绑定的target上的selector,这时target可以读到 CADisplayLink 的每次调用的时间戳,用来准备下一帧显示需要的数据。例如一个视频应用使用时间戳来计算下一帧要显示的视频数据。在UI做动画的过程中,需要通过时间戳来计算UI对象在动画的下一帧要更新的大小等等。
    在添加进runloop的时候我们应该选用高一些的优先级,来保证动画的平滑。可以设想一下,我们在动画的过程中,runloop被添加进来了一个高优先级的任务,那么,下一次的调用就会被暂停转而先去执行高优先级的任务,然后在接着执行CADisplayLink的调用,从而造成动画过程的卡顿,使动画不流畅。

    duration属性提供了每帧之间的时间,也就是屏幕每次刷新之间的的时间。我们可以使用这个时间来计算出下一帧要显示的UI的数值。但是 duration只是个大概的时间,如果CPU忙于其它计算,就没法保证以相同的频率执行屏幕的绘制操作,这样会跳过几次调用回调方法的机会。
    frameInterval属性是可读可写的NSInteger型值,标识间隔多少帧调用一次selector 方法,默认值是1,即每帧都调用一次。如果每帧都调用一次的话,对于iOS设备来说那刷新频率就是60HZ也就是每秒60次,如果将 frameInterval 设为2 那么就会两帧调用一次,也就是变成了每秒刷新30次。
    我们通过pause属性开控制CADisplayLink的运行。当我们想结束一个CADisplayLink的时候,应该调用

   -(void)invalidate即可
    从runloop中删除并删除之前绑定的 target跟selector
    另外CADisplayLink 不能被继承。


    

          二。

    @property (nonatomic,weak)NSTimer *timer;

    

     NSTimer *timer = [NSTimerscheduledTimerWithTimeInterval:(几秒刷一次)2.0f        target:self  selector:@selector(刷新执行方法)userInfo:nilrepeats:YES];

     self.timer = timer;



      NSTimer *timer = [NSTimer timerWithTimeInterval: target: selector:           userInfo:repeats:];//用这个方法需要加入事件循环


    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];


       三。

     CADisplayLink 与NSTimer 有什么不同

     iOS设备的屏幕刷新频率是固定的,CADisplayLink在正常情况下会在每次刷新结束都被调用,精确度相当高。
     NSTimer的精确度就显得低了点,比如NSTimer的触发时间到的时候,runloop如果在阻塞状态,触发时间就会推迟到下一个runloop周期。并且NSTimer新增了tolerance属性,让用户可以设置可以容忍的触发的时间的延迟范围。
     CADisplayLink使用场合相对专一,适合做UI的不停重绘,比如自定义动画引擎或者视频播放的渲染。NSTimer的使用范围要广泛的多,各种需要单次或者循环定时处理的任务都可以使用。在UI相关的动画或者显示内容使用CADisplayLink比起用NSTimer的好处就是我们不需要在格外关心屏幕的刷新频率了,因为它本身就是跟屏幕刷新同步的。




NSTimer的详解

一、初始化方法:有五种初始化方法,分别是

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;

- (void)viewDidLoad {
    [super viewDidLoad];
    //初始化一个Invocation对象
    NSInvocation * invo = [NSInvocation invocationWithMethodSignature:[[self class] instanceMethodSignatureForSelector:@selector(init)]];
    [invo setTarget:self];
    [invo setSelector:@selector(myLog)];
    NSTimer * timer = [NSTimer timerWithTimeInterval:1 invocation:invo repeats:YES];
    //加入主循环池中
    [[NSRunLoop mainRunLoop]addTimer:timer forMode:NSDefaultRunLoopMode];
    //开始循环
    [timer fire];
}

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;

  NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1 invocation:invo repeats:YES];

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;

NSTimer * timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(myLog) userInfo:nil repeats:NO]

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;

NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(myLog:) userInfo:@"123" repeats:YES]

- (instancetype)initWithFireDate:(NSDate *)date interval:(NSTimeInterval)ti target:(id)t selector:(SEL)s userInfo:(id)ui repeats:(BOOL)rep 

 NSTimer * timer = [[NSTimer alloc]initWithFireDate:[NSDate distantPast] interval:1 target:self selector:@selector(myLog:) userInfo:nil repeats:YES];
    [[NSRunLoop mainRunLoop]addTimer:timer forMode:NSDefaultRunLoopMode];

注意:这五种初始化方法的异同:

        1、参数repeats是指定是否循环执行,YES将循环,NO将只执行一次。

        2、timerWithTimeInterval这两个类方法创建出来的对象如果不用 addTimer: forMode方法手动加入主循环池中,将不会循环执行。并且如果不手动调用fair,则定时器不会启动。

        3、scheduledTimerWithTimeInterval这两个方法不需要手动调用fair,会自动执行,并且自动加入主循环池。

        4、init方法需要手动加入循环池,它会在设定的启动时间启动。

二、成员变量

@property (copy) NSDate *fireDate;

设置定时器的启动时间,用来管理定时器的启动与停止

    //启动定时器
    timer.fireDate = [NSDate distantPast];
    //停止定时器
    timer.fireDate = [NSDate distantFuture];

@property (readonly) NSTimeInterval timeInterval;

只读属性!用来获取定时器调用间隔时间。

@property NSTimeInterval tolerance;

 因为NSTimer并不完全精准,通过这个值设置误差范围。

@property (readonly, getter=isValid) BOOL valid;

获取定时器是否有效

@property (readonly, retain) id userInfo;

获取参数信息

三、关于内存释放

    [timer invalidate] 加 timer=nil;将定时器移除。

     如果我们启动了一个定时器,在某个界面释放前,将这个定时器停止,甚至置为nil,都不能是这个界面释放,原因是系统的循环池中还保有这个对象。做法如下:

-(void)dealloc{
    NSLog(@"dealloc:%@",[self class]);
}
- (void)viewDidLoad {
    [super viewDidLoad];
    timer= [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(myLog:) userInfo:nil repeats:YES];
    UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
    btn.backgroundColor=[UIColor redColor];
    [btn addTarget:self action:@selector(btn) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
}
-(void)btn{
    if (timer.isValid) {
        [timer invalidate];
    }
    timer=nil;
    [self dismissViewControllerAnimated:YES completion:nil];
}

    











iOS面试题: Runloop的基本使用 文章目录引言I 使用例子1.1 往运行循环添加特定事件的目标和动作1.2 往运行循环添加计时器1.3 UI 事件处理的RunLoopMode、和定时器的NSRunLoopMode 的关系是什么样的时,可以保证它们能并发执行不影响个自的运行? 引言 RunLoop:An event-processing loop, during which events are received and dispatched to appropriate handlers. 作用 1、决定程序在何时应该处理哪些 阅读详情

相关推荐

iOS小技能: UIKit

文章目录引言I UIKit 的复习1.1 设置控件的状态1.2 设置控件内容的布局1.3 添加监听方法II 代理设计模式2.1 代理的作用是什么?2.2 代理实现的步骤III contentSize和contentInset的区别IV 计时器的播放实现4.1 将timer添加到运行循环4.2 时钟更新方法4.3 停止时钟 引言 UIKit 的复习, 以及delegate 的介绍。 I UIKit 的复习 UIButton->UIControl->UIView UILabel ->

专注于计算机研发知识和资讯分享 1745

runLoop 添加timer的正确方式 (ios oc)

关于runloop的知识请自行补脑。 当项目中需要启动计时器进行计数的时候,往往直接添加到主线程上(默认方式,刷新ui方便),但是会导致诸如:tableview滑动事件、ui操作、app后台切换的时候影响计时的准确性设置导致计时器停止,先来看一般的添加方式: 方式:主线程(NSDefaultRunLoopModes): [NSThread detachNewThreadSelector:

hxmcnu的专栏 936

华为硬件逻辑岗笔试题(一)

积少成多,集腋成裘,坚持!!! 目录 1. 进制转换 2. 状态机和编码方式 3. 存储器的分类 4. Verilog语法中的操作符 5. 对组合逻辑的认识 6. 对时序逻辑的认识 7. 竞争冒险的认识 8. 基本时序逻辑电路 9. 建立时间和保持时间 10. 同步时序电路 11. 组合逻辑和时序逻辑判断 13. 基本总线的理解 14.加法器 15.FPGA开发工具 1. 进制转换 1、十进制46.25对应的二进制表达式为( )。 A 101110.11...

qq_42235129的博客 1万+

Runloop应用详解

RunLoop 是 iOS 应用于线程中的一种循环机制。系统本身没有创建 RunLoop 的 API,不过可以通过 currentRunLoop 获取当前 RunLoop。主线程本身就存在一个 RunLoop,而且是运行转态,子线程的 RunLoop 需要手动开启,否知无法监听到输入源与定时源。子线程 RunLoop 随着所在子线程的事件源结束而关闭,随着所在子线程的结束而释放。

风·之痕的博客 1511

Linux PE vs WinPE:为何麒麟系统修复需要专属工具?

本文探讨了Linux PE与WinPE在修复国产麒麟系统时的关键差异,强调了专属工具的必要性。通过分析文件系统兼容性、引导修复、硬件适配和安全合规等方面,揭示了通用PE工具的局限性,并提供了构建专属修复工具链的实用方案,确保系统维护的高效与安全。

weixin_29290863的博客 1055

python电子学会三级的零碎笔记

‌示例‌:如果s = ['a', 'b', 'c'],则' '.join(s)+'\n'的结果是'a b c\n',写入文件时所有元素会在一行内显示,每个元素之间用空格分隔,末尾有一个换行符。(2) '\n'.join(s)‌:如果s = ['a', 'b', 'c'],则'\n'.join(s)的结果是'a\nb\nc',写入文件时每个元素会占据文件的一行。(1) ' '.join(s)+'\n'‌:这种方式首先将列表s中的每个元素通过空格连接成一个字符串,然后在字符串末尾添加一个换行符\n。

xzal12的博客 690

IOS开发中NSRunloop跟NSTimer的问题

在Windows时代,大家肯定对SendMessage,PostMessage,GetMessage有所了解,这些都是windows中的消息处理函数,那对应在ios中是什么呢,其实就是NSRunloop这个东西。在ios中,所有消息都会被添加到NSRunloop中,分为‘input source’跟'timer source'种,并在循环中检查是不是有事件需要发生,如果需要那么就调用相应的函数处理...

weixin_30551963的博客 181

Dev-C++使用技巧2(亲测)(更改字体和颜色、自动保存、快捷键选项、一键排版)

更改字体和颜色 顶部菜单栏->工具->编辑器选项。 更改字体 当前选项卡->显示,字体word有的基本都有,华文楷体、宋体,幼圆之类。西文字体默认字体Consloas就不错,中文的话幼圆、新宋体都挺不错。 幼圆效果: 新宋体效果: 更改颜色 当前选项卡->语法,分别单击图中的部分,然后在左边修改前景颜色就可以了。需要直接显示的修改前景颜色,背景颜色设为白色;需要选中显示的修改背景颜色,前景设为白色。 自动保存 我们有时候忘记保存或者电脑突然关机,可能会丢失代码。

魔神之云的博客 2万+

iOS的三种常见计时器(NStimer、CADisplayLink、dispatch_source_t)的使用

一、介绍 在iOS中,计时器是比较常用的,用于统计累加数据或者倒计时等,例如手机号获取验证码。计时器大概有那么三种,分别是:NSTimer、CADisplayLink、dispatch_source_t 二、使用 @property (strong,nonatomic)NSTimer *timer; @property (strong,nonatomic)CADisplayLink *displaylinkTimer; @property (strong,nonatomic)dispatch_s

u013712343的博客 2161

基于深度学习YOLOv10的人脸表情识别系统(附完整资源+PySide6界面+训练代码)

本文介绍了如何基于YOLOv10实现一个人脸表情识别系统。我们从数据集准备、模型训练到PySide6界面实现进行了详细的讲解。通过该系统,用户可以实时检测和分类人脸表情,为情感分析、智能交互等应用场景提供支持。

YOLO 1053

【系统架构设计师-2026上半年真题】综合知识-参考答案及详解(75题完全回忆版)

【系统架构设计师-2026上半年真题】综合知识-参考答案及详解(75题完全回忆版)

数据知道的博客 3100

将NSTimer添加至RunLoop中的两种方法区别

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {     self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bou

iOS&Android开发 7930

优快云专栏限时活动!福利公告必读!

本人优快云付费专栏周排名27名专业博主,每周文章平均阅读量约7w以上!

FJN110的博客 3153

ios 倒数器_PS制作苹果IOS7系统中的倒数计时器

在这个PS教程当中,我们来教大家如何用PS软件来制作一张类似于苹果IOS7系统中的倒数计时器图片,具体的方法比较简单,做出来的效果还是比较漂亮的,当然了,下图的背景是可以根据自己的喜好来改变。一、打开photoshop软件创建一730px * 410px的文档,在中心部分添加水平和垂直的辅助线:二、使用椭圆工具Ellipse Tool (U)绘制一120px * 120px的原型,不填充颜色,描边...

weixin_39692172的博客 213

DeepSeek赋能公文写作:从高效成文到精准传情的全维度指南

摘要:AI赋能公文写作的精准化实践 公文写作长期面临框架混乱、素材匮乏、表达不规范、修改低效等痛点。DeepSeek等AI工具通过"精准指令+分步赋能"模式实现突破:首先明确公文的目的性、逻辑性和规范性特征;其次采用包含场景、类型、目的等要素的指令模板;再分四步实施:框架搭建确保层次分明,内容填充解决素材问题,表达优化适配不同语体,合规校验把关格式规范。典型案例显示,AI能将数据罗列转化为"数据+成果+价值"的生动表述,使公文既规范又具感染力。这种AI赋能的写作方法显

通俗易懂学IT 231

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

一对一直播系统iOS开发中的子线程计时器设置方法

不管是在传统直播程序中还是在一对一直播系统中,倒计时都是很常见的功能。不过,计时器的管理是需要多加注意的,如果释放不及时,计时器持有者(相关用户)的视图或视图控制器尚未释放,计时器却继续执行,就会造成一些问题。 关于计时器是否有必要放到主线程中这个问题,是需要开发者自己去仔细衡量的,主线程执行的任务较多,一些涉及倒计时器的相对不需要及时更新或者不在UI上体现的功能,完全可以放到子线程中执行。下面是...

云豹网络科技 1927

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

推荐开源项目:Flutter构建的计时器应用

推荐开源项目:Flutter构建的计时器应用 1、项目介绍 在移动端开发的世界里,Flutter 已经成为一款备受瞩目的跨平台框架,以其高效、简洁和美观的特性吸引了开发者们的目光。本项目是一个简单却精心设计的计时器应用,完全使用 Flutter 编写。它旨在展示 Flutter 的性能,并与原生iOS计时器进行对比,展现Flutter的卓越性能和视觉吸引力。 2、项目技术分析 这款计时器应用充分利...

gitblog_00001的博客 540

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ios 倒数器_PS翻译教程:PS创建iOS7风格倒数计时器

【PConline 教程】这次的PS翻译教程中,将和大家一起学习如果使用使用Photoshop创建iOS7风格的简易倒数计时器。对于平面设计来说,吸引网友眼球非常重要。目前,Apple iOS7操作系统带领了新的扁平化设计潮流。如今,iOS7已经正式发布,我们一起来学习这种设计风格吧。下面先看看iOS7风格的倒数计时器最终效果图吧。图00Step 1打开Photoshop,新建画布,尺寸730像素...

weixin_39758288的博客 146

IOS中H5跳转外部URL的问题

需求:在axios响应的数据当中,其中有一个 url 地址,需要在请求响应成功后,跳转到这个指定的 url 地址。处理方式:使用 window.location.href = url。遇到的问题:pc端、android可以正常跳转,但是ios端跳转不了。解决方法:在外面包裹一个计时器就可以了。

qq_45747074的博客 1707

计时器

// - NSTimer   [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(OnBtnClick) userInfo:nil repeats:YES]; // - CADisplayLink   CADisplayLink * link = [CADisp

Coder 336

IOS 计时器 NSTimer

1、初始化 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; + (NSTimer *)scheduledTimerWithTimeInterva...

weixin_30788731的博客 67

iOS-多线程编程学习之GCD——线程组、延时、计时器等(六)

上一篇文章我们介绍了GCD,以及其队列,同步异步等概念。这次我们将探讨更多GCD的功能,包括线程组(group),栅栏(barrier),单例(once),延时(after),并发迭代(apply)和计时器(timer)。   再有了上一篇文章的基础之后,下面的内容理解起来也会相对容易,所以不会做过多说明,代码中注释也比较详细。所以直接贴代码例子鸟~大家可以下载源代码然后运行查看输出的信息,就可以

来自星星的の松子的博客 560

ios 倒计时在tableview或者collectionview中的重用问题

核心就是在控制器中创建计时器,然后在模型中倒计时时间//计时器 - (void)setUpTimer { self.timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(timerEvent) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLo

不归的道路 819

iOS--RunLoop和NSTimer

一. 什么是Runloop? runloop就是运行循环,每一个应用程序想要保持活性,都会需要这样一个死循环,并不是iOS特有的,runloop可以保证程序不退出。runloop的每一次循环都需要负责时间的监听,例如定时器,触摸时间,网络事件等。当没有事件发生时,runloop会自动使程序休眠。 二. 理解Runloop。 (1) 观望runloop 以计时器为例子,我们这样创建一个计时器,运行,会打印出“计时器” NSTimer * timer=[NSTimer scheduledTimer

u013712343的博客 708
上一篇: iOS中计算UILabel中字符串的高度
下一篇: iOS中 scrollView版轮播器(优化版)
LG_刚刚好
博客等级 码龄10年 14粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值