首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在另一个线程运行时NSTimer被阻止?

在另一个线程运行时,NSTimer可能会被阻止的原因是因为NSTimer是基于RunLoop的,而每个线程默认只有一个RunLoop。当一个线程被阻塞时,RunLoop也会被阻塞,从而导致NSTimer无法正常触发。

具体来说,当我们在另一个线程中创建并启动NSTimer时,NSTimer会被添加到该线程的RunLoop中,并在指定的时间间隔后触发相应的方法。然而,如果该线程正在执行一些耗时的操作或被阻塞,RunLoop将无法正常运行,从而导致NSTimer无法触发。

为了解决这个问题,可以使用以下方法之一:

  1. 使用GCD定时器:GCD定时器是基于Grand Central Dispatch的,不依赖于RunLoop,因此可以在任何线程中使用。可以使用dispatch_source_set_timer函数创建一个GCD定时器,并指定触发的时间间隔和回调方法。
  2. 在主线程中运行NSTimer:由于主线程的RunLoop默认是一直在运行的,所以在主线程中创建并启动NSTimer可以避免被阻塞的问题。可以使用performSelectorOnMainThread方法或者在主线程中使用GCD的dispatch_async函数来执行需要定时触发的方法。
  3. 使用NSRunLoop的runMode方法:如果需要在其他线程中使用NSTimer,并且该线程可能会被阻塞,可以在该线程的RunLoop中手动运行一次,以确保NSTimer能够触发。可以使用NSRunLoop的runMode方法,并指定一个特定的运行模式,使得RunLoop在指定模式下运行一次。

总结起来,当在另一个线程运行时,NSTimer可能被阻止是因为RunLoop被阻塞。为了避免这个问题,可以使用GCD定时器、在主线程中运行NSTimer或者手动运行RunLoop来确保NSTimer的正常触发。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS APP运行时Crash自动修复系统

能够自动app运行时实时捕获导致app崩溃的破环因子,然后通过特定的技术手段去化解这些破坏因子,使app免于崩溃,照样可以继续正常运行,为app的持续运转保驾护航。...如果观察者和keypath的数量一多,很容易理不清楚观察对象整个KVO关系,导致观察者dealloc的时候,还残存着一些关系没有注销。...笔者曾经还遇到过线程的情况下,导致KVO重复添加观察者或移除观察者的情况。这类问题通常多数发生的比较隐蔽,不容易从代码的层面去排查。...,也会因为找不到observer而崩溃,所以需要做这一步来阻止该种情况的发生。...3.8 非主线程刷UI类型crash防护(UI not on Main Thread) 非主线程刷UI将会导致app运行crash,有必要对其进行处理。

3.3K1713
  • 深入理解RunLoop及开发中的应用

    2.RunLoop第一次获取时创建,在线程结束时销毁;只能在一个线程的内部获取其 RunLoop(主线程除外)。...这就是为什么App程序启动之后能够持续运行在前台的原因。 三....例如触摸,滚动,selector选择器等用户触发的事件;(只包含了一个回调函数,它并不能主动触发事件) Source1:基于端口port,一些系统事件; (包含了一个 mach_port 和一个回调函数,用于通过内核和其他线程相互发送消息...解决NSTimerUIScrollView滑动时停止工作的问题 默认情况下,滚动 tableView、UIScrollView 的时候,NSTimer会停止工作,这是因为滚动时,RunLoop...会进入另一个Mode 模式UITrackingRunLoopMode 下,该模式下,定时器就会停止,当不在滚动 UITextView , 定时器会重新开始。

    1.3K20

    iOS_Memory Leak 内存泄露治理

    ---- 3、Analyze 静态分析入口: 分析案例: 缺陷:只能检查编译时的内存泄漏,并不能检测到所有的内存泄漏,如:发生在运行时,或需要用户操作时产生的泄露。...,调用路径中能够清晰看到占用内存最大的线程 Invert Call Tree:反转调用堆栈顺序 Hide System Libraries:隐藏系统库的调用堆栈信息 Flatten Recursion...10.4、原理 为NSObject新增一个-willDealloc方法: 2s 后给弱引用的self发送assertNotDealloc消息: 若self释放则不会执行; 若self未被释放则会执行...NSTimer 为什么这么容易导致内存泄露: 很重要的一点是因为 RunLoop 会强引用 NSTimer(系统实现的无法做修改)。...当开发者直接传入 self 时,就导致了 self 无法释放,进而在 dealloc 里释放 NSTimer 的代码也不会执行,从而导致了内存泄露:RunLoop -> NSTimer -> self

    74820

    备战九十,iOS面试题菜单,持续更新(题目及答案已上传Github)

    autoreleasePool 何时释放? 解释一下 事件响应 的过程? 解释一下 手势识别 的过程? 解释一下 GCD Runloop 中的使用? 解释一下 NSTimer。...如何使用 Runloop 实现一个常驻线程?这种线程一般有什么作用? 为什么 NSTimer 有时候不好使? PerformSelector:afterDelay:这个方法线程中是否起作用?...能否向运行时创建的类中添加实例变量?为什么? 给类添加一个属性后,类结构体里哪些元素会发生变化? 一个objc对象的isa的指针指向什么?有什么作用?...内存管理方案 MRC(手动引用计数)和ARC(自动引用计数) 循环引用 讲一下 iOS 内存管理的理解 使用自动引用计数应遵循的原则 ARC自动内存管理的原则 访问 __weak 修饰的变量,是否已经注册了...ARC 在编译时做了哪些工作 ARC 在运行时做了哪些工作? 函数返回一个对象时,会对对象 autorelease 么?为什么? 说一下什么是 悬垂指针?什么是 野指针?

    1.3K00

    浅析 NSTimer 和 CADisplayLink 内存泄漏

    第一种就是直接在 TableView 的 Cell 上使用 NSTimer,然后添加到当前线程所对应的 RunLoop 中的 commonModes 中。...当然下方代码片段我们是全局队列中添加的 DispatchTimerSource,线程中进行更新。...当然我们不建议 MainQueue 中做,因为在编程时尽量的把一些和主线程关联不太大的操作放到子线程中去做。...可以设想一下,我们动画的过程中,runloop 添加进来了一个高优先级的任务,那么,下一次的调用就会被暂停转而先去执行高优先级的任务,然后接着执行 CADisplayLink 的调用,从而造成动画过程的卡顿...我们开启了一个新的线程,并且将 CADisplayLink 对象添加到这个子线程的 RunLoop 中,然后线程中更新UI即可。

    1.6K10

    iOS多线程——你要知道的RunLoop都在这里你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里

    为key,以RunLoop对象为value,并且,第一次获取RunLoop对象时总会先把主线程关联的RunLoop对象创建好,获取其他线程关联的RunLoop对象时都从这个全局的字典中获取,如果没有获取到就创建一个并且添加进字典中...NSTimer,这两个定时器执行效果相同,但如果页面中有一个UIScrollView或其子类的对象滑动时,NSTimer就不会再有任何输出,当停下滑动时又会有输出,因为上述代码创建的两个NSTimer...通过上述讲解,可以发现,NSTimer其实是不那么精确的,首先,使用时需要加入到RunLoop中,如果加在CommonMode普通情况或滑动时都可以执行回调方法,这个时候的误差就来自于RunLoop...如果加在其他模式下,当模式切换时就不会再执行NSTimer的回调方法了,所以,使用时需要根据情况选择不同的定时器以满足项目需求。...线程将进入休眠, 直到下面某一个事件唤醒。 /// • 一个基于 port 的Source 的事件。

    1.5K80

    iOS - 关于NSTimer的循环引用

    现象 在当前控制器(ViewController)的view上添加了一个自定义的view(LXFTimerView), LXFTimerView成功创建出来后添加了定时器NSTimer并加入RunLoop...引用关系 问题就出在LXFTimerView与NSTimer之间,创建定时器时执行 [NSTimer scheduledTimerWithTimeInterval: target: selector:...NSTimer 翻译:定时器保持着对target的强引用,直到定时器作废 那为什么LXFTimerView中的timer属性要用weak??...不用着急,下面�即将揭晓~ 解决方案 让定时器指着另一个对象,让那个对象来执行LXFTimerView中需要执行的方法。 引用关系如下图所示 ?...当没有定时器强引用的LXFTimerView从父控件上移除时,就会执行dealloc方法,LXFTimerView销毁。

    1.1K30

    NSRunLoop-iOS中隐藏的大杀器

    当事件源发生时RunLoop会唤醒线程来处理事件。 - 如果把一般线程的执行看作是一条直线,有起点终点, 而runloop就是把这个线连接成圆圈,一直跑圈,除非切断否则一直线程一直在运行。...- 每一个线程都有其对应的RunLoop,但是默认非主线程的RunLoop是没有运行的, (主线程上的RunLoopApp运行时由系统自动启动),需要为RunLoop添加至少一个事件源, 然后去...其中input source分发异步事件给相应的处理程序并且调用runUntilDate:方法(这个方法会在该线程关联的NSRunLoop 对象上调用)来退出其Run Loop。...通过Observer监听RunLoop的状态 线程即将休眠时,释放自动释放池 线程即将唤醒时,再次创建自动释放池,并将之前的对象再次放入池中 RunLoop 和定时器 创建一个NSTimer定时器...第二种: 另一种解决Timer的方法是,我们另外一个线程执行和处理 Timer 事件,然后线程更新UI。

    1.1K10

    2020-iOS最新面试题解析—1(原理篇)

    无论MRC下还是ARC下均不需要 关联的对象在生命周期内要比对象本身释放的晚很多,它们会在被 NSObject -dealloc 调用的 object_dispose()方法中释放 补充:对象的内存销毁时间表...能否向运行时创建的类中添加实例变量?为什么?...每条线程都有唯一的一个RunLoop对象与之对应的 主线程的RunLoop是自动创建并启动 子线程的RunLoop需要手动创建 子线程的RunLoop创建步骤如下: 线程中调用NSRunLoop currentRunLoop...,timer会暂定回调,为什么?...scheduledTimerWithTimeInterval:...方法来构建NSTimer,就不需要主动启动RunLoop对象,因为主线程的RunLoop对象程序运行起来就已经启动了 ``

    1.7K21

    iOS学习——浅谈RunLoop

    1 RunLoop基础 1.1 RunLoop的基本作用 保持程序的持续运行(ios程序为什么能一直活着不会死) 处理app中的各种事件(比如触摸事件、定时器事件【NSTimer】、selector事件...4.线程中,如果不主动获取Runloop的话,那么子线程内部是不会创建Runloop的。可以下载CFRunloopRef的源码,搜索_CFRunloopGet0,查看代码。...基本上说的就是NSTimer   NSTimer实际开发中会出现不准的情况,出现这种情况的主要是NSTimer的初始化有两种方法如下,然后第一种方法会自动添加到当前的RunLoop中,并且RunLoop...的运行模式mode设置为kCFRunLoopDefaultMode,这种模式界面拖拽时运行mode变为UITrackingRunLoopMode,这时候defaultmode下的定时器就会停止工作,...一个mode里面可以添加多个NSTimer,也就是说以后当创建NSTimer的时候,可以指定它是什么模式下运行的。

    72721

    当JavaScriptCore遇上多线程

    : [t0fk3xbqzs.png] 不同VM 这里是本文的重点,按道理说,不同VM中是可以并发执行JS代码的,不需要相互等待,那为什么还会发生死锁呢?...*timer = [NSTimer scheduledTimerWithTimeInterval:1/60.0 repeats:YES block:^(NSTimer * _Nonnull timer...[loj7az9syt.png] 这个构造函数不能更简单了,首先创建一个新的VM,然后调用另一个带VM参数的构造函数。...: TimerDidFire先执行,那么主线程则不会被锁上 或者工作线程执行JS代码很快,直到主线程打印完'hhh'之后TimerDidFire才触发,这样主线程也不会被锁 但假如是工作线程先执行JS...代码,VM的锁工作线程持有了,然后主线程触发TimerDidFire,那么主线程就要等待工作线程释放VM的锁,然而这时工作线程又要dispatch_sync主线程,就会造成相互等待,发生死锁了。

    3.3K51

    自欺欺人的使用 NSTimer 销毁

    :@selector(timerAction:) userInfo:nil repeats:YES]; 第一种缺陷如果当前线程就是主线程,也就是UI线程时,某些UI事件,比如UIScrollView的拖动操作...NSEventTrackingRunLoopMode的结合 [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes]; 以上两种方式都是线程上创建的...,如果在子线程创建的timer,加入到runloop则需要手动开启runloop[[NSRunLoop currentRunLoop] run];,同时也必须在子线程销毁。...也就是说 NSTimer 强引用了 self ,self的全局变量 NSTimer 又使 self 强引用了 NSTimer,导致 self 一直不能释放掉,所以也就走不到 self 的 dealloc...(10.0), watchos(3.0), tvos(10.0)); 自定义分类创建NSTimer,适用于iOS 10以前 原理等同于以上方法,把 target 转换为 NSTimer 自身然后把控制器的定时器方法

    1.9K70

    自欺欺人的使用 NSTimer 销毁

    :@selector(timerAction:) userInfo:nil repeats:YES]; 第一种缺陷如果当前线程就是主线程,也就是UI线程时,某些UI事件,比如UIScrollView的拖动操作...NSEventTrackingRunLoopMode的结合 [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes]; 以上两种方式都是线程上创建的...,如果在子线程创建的timer,加入到runloop则需要手动开启runloop[[NSRunLoop currentRunLoop] run];,同时也必须在子线程销毁。...也就是说 NSTimer 强引用了 self ,self的全局变量 NSTimer 又使 self 强引用了 NSTimer,导致 self 一直不能释放掉,所以也就走不到 self 的 dealloc...(10.0), watchos(3.0), tvos(10.0)); 自定义分类创建NSTimer,适用于iOS 10以前 原理等同于以上方法,把 target 转换为 NSTimer 自身然后把控制器的定时器方法

    47260

    iOS 如何监测 FPS

    CADisplayLink 实际上跟平常用的 NSTimer 的用法基本相似,NSTimer 的时间间隔是以秒为单位,而 CADisplayLink 则是使用帧率来作为时间间隔的单位。...} 在运行时可以看到,打印出来的帧率为: 可是通过 Instrument 的 Core Animation 进行监测的时候,其结果却是: 两者完全就对不上啊。...然后 GPU 就切换指向到另一个帧缓冲区,重复上述工作。 由此可以得知,因为 CADisplayLink 的运行取决于 RunLoop。...主线程卡顿监测 由于 CADisplayLink 并不能够准确反映出来,所以常用的方法时主线程卡顿监测。...通过开辟一个子线程来监测主线程的 RunLoop,当两个状态区域的耗时大于设定的阈值时,即为一次卡顿。 根据如何监控卡顿[3]的介绍,可以得知主线程卡顿监测的原理以及做法。

    1.9K30

    iOS多线程:『RunLoop』详尽总结RunLoop

    1.2 RunLoop和线程 RunLoop和线程是息息相关的,我们知道线程的作用是用来执行特定的一个或多个任务,但是默认情况下,线程执行完之后就会退出,就不能再执行任务了。...我们只能在当前线程中操作当前线程的RunLoop,而不能去操作其他线程的RunLoop。 RunLoop对象第一次获取RunLoop时创建,销毁则是在线程结束的时候。...repeats:YES]; 这句代码调用了scheduledTimer返回的定时器,NSTimer会自动加入到了RunLoop的NSDefaultRunLoopMode模式下。...将线程置于休眠知道任一下面的事件发生: 某一事件到达基于端口的源 定时器启动 RunLoop设置的时间已经超时 RunLoop显示唤醒 通知观察者线程将被唤醒 处理未处理的事件 如果用户定义的定时器启动...4.1 NSTimer的使用 NSTimer的使用方法讲解CFRunLoopTimerRef类的时候详细讲解过,具体参考上边 2.3 CFRunLoopTimerRef。

    2.1K50

    2017年5月iOS招人心得(附面试题)

    为什么默认情况下无法修改block捕获的变量? __block都做了什么? 模拟一下循环引用的一个情况?block实现界面反向传值如何实现?...能否向运行时创建的类中添加实例变量?为什么? runtime如何实现weak变量的自动置nil? 给类添加一个属性后,类结构体里哪些元素会发生变化? RunLoop runloop是来做什么的?...为什么NSTimer对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环以后,滑动scrollview的时候NSTimer却不动了?...它为什么会覆盖掉原来的方法? 运行时能增加成员变量么?能增加属性么?如果能,如何增加?如果不能,为什么? objc中向一个nil对象发送消息将会发生什么?...AFN为什么添加一条常驻线程? KVO的使用?实现原理?(为什么要创建子类来实现) KVC的使用?实现原理?(KVC拿到key以后,是如何赋值的?

    57140

    iOS PerformSelector 遗漏问题

    一 基础用法 performSelecor响应了OC语言的动态性:延迟到运行时才绑定方法。...,为了避免运行时突然报错找不到方法等问题,少使用performSelector方法。...其实说到对时间方面的处理项目中经常用到的是NSTimer:当一个NSTimer注册到Runloop后,Runloop会重复的相应的时间点注册事件,当然Runloop为了节省资源并不会在准确的时间点触发事件...而performSelector:withObject:afterDelay:其实就是在内部创建了一个NSTimer,然后会添加到当前线程的Runloop中。...test方法中执行的子线程是同一个,也就是说: 对于该performSelector延迟方法而言,如果在主线程中调用,那么test方法也是线程中执行;如果是线程中调用,那么test也会在该子线程中执行

    49510
    领券