首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏全栈程序员必看

    IOS系列——NStimer

    初始化 timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(changeTime:) dictionaryWithObject:[NSString stringWithFormat:@"%i",animIndexPath] forKey:@"animIndexPath"]; timer = [NSTimer :self selector:@selector(changeTime:) userInfo:dic repeats:YES]; 在timer运行的方法里面 -(void)changeTime:(NSTimer

    41410编辑于 2022-07-08
  • 来自专栏搜狗测试

    iOS计时器:NSTimer

    背景 前阵子在整理RunLoop原理的时候发现代码中用到了很多NSTimer,其中也出现了挺多问题,这里整理了一些NSTimer的使用方法供大家使用避坑。 ? NSTimer介绍 NSTimer的创建通常有两种方式,一种是以scheduledTimerWithTimeInterval 为开头的类方法 。 这些方法创建的NSTimer 并不能马上使用,还需要调用 RunLoop 的addTimer:forMode: 方法将 NSTimer 放入 RunLoop,这样 NSTimer 才能正常工作。 传入给 NSTimer,在NSTimer 的 category 里面触发selector 。 RunLoop 为了节省资源,并不会在非常准确的时间点回调这个 NSTimerNSTimer 有个属性叫做 Tolerance 表示回调 NSTimer 的时间点容许多少最大误差。

    2.2K20发布于 2020-07-16
  • 来自专栏iOS 备忘录

    iOS NSTimer不走的问题

    iOS NSTimer不走的问题 背景 这个版本上线后,突然发现埋点数据直线下降,调试后发现是定时器上传的方法没有走,但是定时器的方法本期并没有修改过。 代码如下 - (BOOL)initTimer() { self.uploadTimer = [NSTimer scheduledTimerWithTimeInterval:timerInterval 解决方法:在子线程启动一下runloop即可 - (BOOL)initTimer() { self.uploadTimer = [NSTimer scheduledTimerWithTimeInterval 参考 IOS定时器操作和NSTimer的各种坑

    77721发布于 2021-03-01
  • 来自专栏编程语言

    NSTimer 滑动导致失效

    关键地方: 1.封装一个NSTimer  作用:防止循环引用 2.NStimer 在滑动时停止运行, 解决方法:1.通过修改timer默认mode, NSRunLoopCommonModes(滑动时主线程会从 [NSThread detachNewThreadWithBlock:^{ timerTarget.timer = [NSTimer scheduledTimerWithTimeInterval nonatomic, weak) id target; @property (nonatomic, assign) SEL selector; @property (nonatomic, weak) NSTimer * timer; @end @implementation HSTimerTarget - (void)timeAction:(NSTimer *)timer { if(self.target . // #import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interface HSTimer : NSObject + (NSTimer

    45120编辑于 2022-09-30
  • 来自专栏iOS 开发杂谈

    浅谈 NSTimer 是否精确?

    面试的时候遇到一个问题,问 NSTimer 用做定时器的时候是否精确? +0800 NSTimer&CADisplayLink[60411:3510935] timer test 2018-09-15 13:29:24.041953+0800 NSTimer&CADisplayLink :27.042001+0800 NSTimer&CADisplayLink[60411:3510935] timer test 2018-09-15 13:29:28.042379+0800 NSTimer NSTimer *timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(countDown) userInfo: :26.471093+0800 NSTimer&CADisplayLink[60938:3548123] timer test 2018-09-15 13:58:27.470769+0800 NSTimer

    75220发布于 2018-09-30
  • 来自专栏娱乐心理测试

    多线程与NSTimer

    1.Ios主线程,也称UI线程,在主线程中使用NSTimer,runloop是自动开启的,(如果NSTimer当前所处的线程正在进行大数据处理(假设为一个大循环),NSTimer本次执行会等到这个大数据处理完毕之后才会继续执行 在主线程中调用 NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(timer_callback forMode:NSRunLoopCommonModes]; 2.在子线程中(NSThread开辟新的子线程),使用计时器时,需要[[NSRunLoop currentRunLoop] run],(如果NSTimer 当前所处的线程正在进行大数据处理(假设为一个大循环),(类似操作列表的滑动过程)使用NSDefaultRunLoopMode模式NSTimer会正常的运行。 *timer= [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(timer_callback) userInfo:nil

    1.3K50发布于 2018-06-13
  • 来自专栏ShaoYL

    NSTimer类的使用

    创建一个 Timer + scheduledTimerWithTimeInterval: invocation: repeats: + (NSTimer *)scheduledTimerWithTimeInterval   repeats:(BOOL)yesOrNo; + scheduledTimerWithTimeInterval: target: selector: userInfo: repeats: + (NSTimer target:(id)aTarget   selector:(SEL)aSelector   userInfo:(id)userInfo   repeats:(BOOL)yesOrNo; 创建返回一个新的NSTimer + timerWithTimeInterval: invocation: repeats: + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation *)invocation repeats:(BOOL)yesOrNo; + timerWithTimeInterval: target:selector: userInfo:repeats: + (NSTimer

    96190发布于 2018-05-11
  • 来自专栏ShaoYL

    自欺欺人的使用 NSTimer 销毁

    自欺欺人的使用 NSTimer 销毁 Demo地址 1.NSTimer是要加到runloop中才会起作用。 2.NSTimer会强引用它的target对象。 也就是说 NSTimer 强引用了 self ,self的全局变量 NSTimer 又使 self 强引用了 NSTimer,导致 self 一直不能被释放掉,所以也就走不到 self 的 dealloc 因为Runloop对NSTimer 有了强引用,指向NSTimer那块内存。 *timer))block { // 此时的 target 为 NSTimer return [NSTimer timerWithTimeInterval:time target:self

    2.1K70发布于 2018-05-11
  • 来自专栏网罗开发

    iOS 如何解决 NSTimer 循环引用

    前言 ---- 在使用 NSTimer,如果使用不得当特别会引起循环引用,造成内存泄露。所以怎么避免循环引用问题,下面我提出几种解决 NSTimer 的几种循环引用。 2. ,NSTimer 强引用 PFTimer,避免让NSTimer 强引用 ViewController,这样就不会引起循环引用,然后在 dealloc 方法中执行 NSTimer 的销毁,相对的 PFTimer 苹果系统API可以解决(iOS10以上) ---- 在 iOS 10.0 以后,苹果官方新增了关于 NSTimer 的三个 API: + (NSTimer *)timerWithTimeInterval 使用很简单,但是要注意两点: 避免 block 的循环引用,使用 __weak 和 __strong 来避免 在持用 NSTimer 对象的类的方法中 -(void)dealloc 调用 NSTimer +PFSafeTimer.m 中的代码如下: #import "NSTimer+PFSafeTimer.h" @implementation NSTimer (PFSafeTimer) + (NSTimer

    1.8K30发布于 2021-04-07
  • 来自专栏LinXunFeng的专栏

    iOS - 关于NSTimer的循环引用

    现象 在当前控制器(ViewController)的view上添加了一个自定义的view(LXFTimerView), LXFTimerView在成功创建出来后添加了定时器NSTimer并加入RunLoop LXFTimerView.m #import "LXFTimerView.h" @interface LXFTimerView() /** 定时器 */ @property(nonatomic, weak) NSTimer 定时器方法 /** 添加定时器方法 */ - (void)addTimer { // 创建定时器 if (self.timer) { return; } self.timer = [NSTimer 引用关系 问题就出在LXFTimerView与NSTimer之间,在创建定时器时执行 [NSTimer scheduledTimerWithTimeInterval: target: selector: NSTimer 翻译:定时器保持着对target的强引用,直到定时器作废 那为什么LXFTimerView中的timer属性要用weak??

    1.5K30发布于 2018-06-29
  • 来自专栏iOS 开发杂谈

    浅析 NSTimer 和 CADisplayLink 内存泄漏

    内存泄漏原因 谈论 NSTimer & CADisplayLink 内存泄漏,要理解 NSTimer & CADisplayLink 的基础概念,下面通过一个倒计时的实现的 demo 进入正题。 以 UITableViewCell 为例: 一、在 Cell 中直接使用 NSTimer 首先我们按照常规做法,直接在 UITableView 的 Cell 上添加相应的 NSTimer, 并使用 scheduledTimer 1、NSTimer Target [图片上传失败... #import "NSTimer+TimerTarget.h" @implementation NSTimer (TimerTarget) + (NSTimer *)my_scheduledTimerWithTimeInterval NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.25 target:[TimerProxy timerProxyWithTarget

    1.9K10发布于 2018-09-11
  • 来自专栏iOS 备忘录

    iOS NSTimer不走的问题

    iOS NSTimer不走的问题 背景 这个版本上线后,突然发现埋点数据直线下降,调试后发现是定时器上传的方法没有走,但是定时器的方法本期并没有修改过。 代码如下 - (BOOL)initTimer() { self.uploadTimer = [NSTimer scheduledTimerWithTimeInterval:timerInterval 解决方法:在子线程启动一下runloop即可 - (BOOL)initTimer() { self.uploadTimer = [NSTimer scheduledTimerWithTimeInterval 参考 IOS定时器操作和NSTimer的各种坑

    1.6K31发布于 2020-08-19
  • 来自专栏日常技术分享

    NSTimer 导致UIViewController无法正常释放

    假如有一个需求,要求B页面每隔5秒请求一次数据,所以用了NSTimer 代码如下 self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target 原因:当我们使用NSTimer的方法时,定时器对象会对它的target(即self:当前控制器)持有强引用,如果定时器不销毁,则控制器无法释放。

    1.5K30发布于 2018-12-12
  • 来自专栏全栈程序员必看

    NSTimer scheduledTimerWithTimeInterval与timerWithTimeInterval、initWithFireDate的区别

    . - (void)execute { NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector timer forMode:NSDefaultRunLoopMode]; [[NSRunLoop currentRunLoop] run]; } 2. - (void)execute { [NSTimer

    48240编辑于 2022-09-07
  • 来自专栏ShaoYL

    自欺欺人的使用 NSTimer 销毁

    自欺欺人的使用 NSTimer 销毁 Demo地址 1.NSTimer是要加到runloop中才会起作用。 2.NSTimer会强引用它的target对象。 也就是说 NSTimer 强引用了 self ,self的全局变量 NSTimer 又使 self 强引用了 NSTimer,导致 self 一直不能被释放掉,所以也就走不到 self 的 dealloc 因为Runloop对NSTimer 有了强引用,指向NSTimer那块内存。 *timer))block { // 此时的 target 为 NSTimer return [NSTimer timerWithTimeInterval:time target:self

    60260发布于 2018-06-21
  • 来自专栏一“技”之长

    iOS NSTimer 定时器用法总结 原

    NSTimer在IOS开发中会经常用到,尤其是小型游戏,然而对于初学者时常会注意不到其中的内存释放问题,将其基本用法总结如下: 一、初始化方法:有五种初始化方法,分别是 + (NSTimer *)timerWithTimeInterval  mainRunLoop]addTimer:timer forMode:NSDefaultRunLoopMode];     //开始循环     [timer fire]; } + (NSTimer  * timer = [NSTimer scheduledTimerWithTimeInterval:1 invocation:invo repeats:YES]; + (NSTimer *)timerWithTimeInterval aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval @property NSTimeInterval tolerance; 这是7.0之后新增的一个属性,因为NSTimer并不完全精准,通过这个值设置误差范围。

    1.4K10发布于 2018-08-15
  • 来自专栏iOS开发~

    iOS_定时器:NSTimer、GCDTimer、DisplayLink

    NSTimer (MOBlock) + (NSTimer *)mo_scheduledTimerWithTimeInterval:(NSTimeInterval)ti repeats:(BOOL)yesOrNo // 使用如下: self.timerFirst = [NSTimer mo_scheduledTimerWithTimeInterval:2 repeats:YES block:^(NSTimer ) 2.RunLoop对NSTimer保持强引用 (容易导致内存泄露问题) 3.子线程中默认不创建RunLoop,导致NSTimer失效 4.NSTimer的创建和撤销必须在同一个线程操作,不能跨线程操作 可以看得出NSTimer不太强调多高的精确度。 GCD 比较精准,不依赖于RunLoop,用dispatch_source_t实现,代码较多可控性强 github Demo 地址 参考: NSTimer使用解析 NSTimer定时器进阶——详细介绍

    1.3K20编辑于 2022-07-20
  • 来自专栏日常技术分享

    iOS NSTimer 什么时候需要使用NSRunLoopCommonModes

    当使用NSTimer的scheduledTimerWithTimeInterval方法时。此时Timer会被加入到当前线程的Run Loop中,且模式是默认的NSDefaultRunLoopMode。 比如滑动UIScrollView的时候,NSTimer的处理时间根本没有调用,当松手的时候,又执行了。 原因:当滑动UIScrollView的时候,RunLoop切换成UITrackingRunLoopMode模式,而NSTimer默认注册NSDefaultRunLoopMode模式,所以拖动时Timer NSTimer *timer=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(Handlete) userInfo

    1.6K20发布于 2018-12-12
  • 来自专栏iOS 技术分享

    深入浅出 RunLoop(五):RunLoop 与 NSTimer

    RunLoop 与 NSTimer 由前面的文章我们知道,NSTimer是由RunLoop来管理的,NSTimer其实就是CFRunLoopTimerRef,他们之间是 toll-free bridged NSTimer的创建方式 如果我们是通过以下方法创建的NSTimer,是自动添加到RunLoop的默认模式下的 [NSTimer scheduledTimerWithTimeInterval:1.0 RunLoop的某种模式下 NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _ 比如NSTimer每1.0秒就会执行一次任务,Runloop每进行一次循环,就会看一下NSTimer的时间是否达到1.0秒,是的话就执行任务。 ,导致NSTimer不准时。

    97710发布于 2020-04-16
  • 来自专栏浮躁的喧嚣

    系统框架--52:NSTimer会保留其目标对象

    NSTimer 计时器要和runloop相关联,runloop会触发任务。创建NSTimer时,可以将其“预先安排”在当前的runloop中,也可以创建好,然后再由开发人员自己调度。 或许在倒计时程序中,你可以重写返回方法,先调用end再返回,但这不是一个好主意 这里采用block块的方法为NSTimer增加一个分类,具体细节看代码(程序员最好的语言是代码)。 #import <Foundation/Foundation.h> @interface NSTimer (SSBlockSupport) + (NSTimer *)ss_scheduledTimerWithTimeInterval *timer))block; @end ---------- #import "NSTimer+SSBlockSupport.h" @implementation NSTimer (SSBlockSupport (void (^)(NSTimer *timer))block{ return [NSTimer scheduledTimerWithTimeInterval:inerval target:self

    51510编辑于 2023-11-22
领券