ios开发之runloop

iOS开发面试-当面试官问Runloop时,想听到的答案是什么? Runloop这个算是iOS开发者面试中最常见的问题之一了把,但是每次面试遇到这种问题都会菊花一紧,生怕回答的少了,同时也怕回答的不够全面。所以针对这一问题,总结了一下几个级别的开发者需要知道点进行归纳。 初级(0-3年) 如果你要去面试初级,以现在的内卷的程度,这个问题基本上是跑不了的,想当年作者还是初级的时候,连runloop都不知道是什么。。。 Runloop 是什么 Runloop是通过内部维护的事件循环来对事件/消息进行管理的一个对象 这里有两个重点 事件循环 事件/消息进行管理 什 阅读详情

runloop:运行循环。

1.开启一条线程,这条线程就是这个app的主线程。

2.这个主线程是常驻线程(一旦启动,就不再退出),这条线程上的runloop被开启。

程序启动入口函数:main()

int main(int argc, char * argv[]) {
    NSString * appDelegateClassName;
    @autoreleasepool {
        // Setup code that might create autoreleased objects goes here.
        appDelegateClassName = NSStringFromClass([AppDelegate class]);
    }
    return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}

现在在main函数中执行一个操作

int a = UIApplicationMain(argc, argv, nil, appDelegateClassName);
NSLog(@"执行");
return a;

此时可以发现,log是不会打印的。

由此可见,在app开启的时候,就开启了一个死循环,持续执行。

runloop就是一个死循环

runloop作用:

1.主线程runloop保证程序不退出,子线程runloop保证线程不退出。

2.监听事件:负责监听所有的事件。在iOS中:触摸、时钟、网络事件。

runloop有5种模式(用到的三种)

1.默认模式 NSDefaultRunLoopMode。---------------- 处理网络事件,timer

2.UI模式(runloop优先处理source:触摸事件)UITrackingRunLoopMode -------UI事件

3.NSRunLoopCommonModes 占位模式(并不是runloop真正的模式)

4.初始化模式,不开放给程序员

5.系统内核模式,不开放给程序员

UI模式优先级最高,但是只能被UI事件唤醒。timer加在UI模式下不会进行处理。

在主线程runloop添加timer,timer回调方法中执行耗时操作,会造成程序卡顿。因此:timer中不建议处理耗时的操作(耗时操作需要放在子线程中)

例:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerMethod:) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
    
}

- (void)timerMethod{
    [NSThread sleepForTimeInterval:1.0];
    NSLog(@"%@",[NSThread currentThread]);
}

上边的写法就会造成主线程的卡顿现象发生。所以为了解决这个问题,放在考虑放在子线程中处理。例:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSThread *thread = [[NSThread alloc]initWithBlock:^{
        NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerMethod:) userInfo:nil repeats:YES];
        [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
    }];
    [thread start]; 
}

- (void)timerMethod{
    [NSThread sleepForTimeInterval:1.0];
    NSLog(@"%@",[NSThread currentThread]);
}

此时就会发现,在子线程中,执行完代码,子线程被销毁。因此需要考虑线程保活。

思路一:用一个强引用的全局变量指向线程。会发现线程在执行完毕之后,依旧被销毁。不可用。

线程的生命:是由CPU调度的。只和线程的任务有关系,任务执行完成,线程自动销毁。

线程是CPU调度与执行,与OC对象没有关系。

在线程中添加一个死循环,会发现线程不会被销毁,而指向线程的对象也不会被释放。例:

NSThread *thread = [[NSThread alloc]initWithBlock:^{
        NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerMethod:) userInfo:nil repeats:YES];
        [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
        while (true) {
            
        }
    }];

此时,定时器的方法依旧不会调用。因为线程上的runloop需要手动调用。只是添加一个死循环保住线程。此时没有死循环依然会正常执行,说明runloop run方法开启了一个死循环。

[[NSRunLoop currentRunLoop] run];

runlopprunlo取消:runloop开启后,无法取消。

因此可以考虑这样做,例:

 while (_Finished) {
            [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.000001]];
        }

也可以考虑退出线程:

[NSThread exit];

提示:退出主线程,app不会挂掉,不响应任何操作,子线程会继续执行。

主线程是UI线程,更新UI。

UIKit不是线程安全。因此约定只在主线程访问UI。(多条线程对同一个对象进行操作,就会出现资源抢夺)。

1.主线程与子线程没有任何区别,主线程是系统开启的。

2.主线程启动的时候进行界面渲染等其他操作,主线程挂掉,不再处理界面山任何东西。

timer的方法是事件不是任务

事件和任务的区别:

在线程创建出来的时候执行的代码就是任务,runloop也是任务。runloop处理的任务就是事件。

runloop没有创建方法:runloop是一个懒加载的方法,在第一次调用的时候创建。

source

事件源、输入源

按照函数调用栈source分类:

source0 非系统内核事件

source1 系统内核事件

observer

CFRunloop :CoreFoundation

CoreFoundation内存不由ARC进行管理

create new copy 这类名称开头的函数会在堆区域开辟内存空间。需要进行内存管理。

malloc创建一个指针,申请内存区域。

free 将指针指向的内存置为空

iOS开发:Runloop专栏 Runloop概念:Runloops是与线程相关的基础框架的一部分。一个Runloop就是一个事件处理的循环,用来不停的调度工作以及处理输入事件。其实它内部就是do-while循环,这个循环内部不断地处理各种任务(比如Timer,Observer)。 阅读详情

相关推荐

iOS高级开发工程师面试——RunLoop

RunLoop可以称之为运行循环,在程序运行过程中循环做一些事情,如果没有RunLoop程序执行完毕就会立即退出,有RunLoop程序会一直运行,并且时时刻刻在等待用户的输入操作。RunLoop可以在需要的时候自己跑起来运行,在没有操作的时候就停下来休息。充分节省CPU资源,提高程序性能。基本作用1. 保持程序持续运行。程序一启动就会开一个主线程,主线程一开起来就会跑一个主线程对应的RunLoopRunLoop保证主线程不会被销毁,也就保证了程序的持续运行。2. 处理App中的各种事件。

wahkim的博客 1038

Runloop

学过操作系统的都知道,一个线程对应一个消息队列,iOS里消息队列被叫做Runloop,但是,runloop比消息队列做的事多得多。 正常情况下,线程执行完任务(消息队列里的任务)就会自动退出,就main函数而言,他顺序执行完代码后就会return,但一个应用在其没有任务时也不会退出,当有事件时他会立马去执行,就像随时待命一样。这就是runloop的作用。简而言之runloop就是让线程一直活着。

MM_dou的专栏 509

多核系统核间通信(IPC)设计:从硬件机制到软件实现

在多核处理器与嵌入式系统设计中,核间通信(IPC)是实现计算资源协同工作的核心技术。其原理基于共享内存、硬件邮箱与中断等底层硬件机制,通过构建结构化的消息传递通道,实现核间高效、可靠的数据交换。该技术的核心价值在于打破多核间的壁垒,将分散的计算单元整合为有机整体,从而显著提升系统整体性能与响应能力。在工程实践中,IPC广泛应用于智能座舱、边缘AI网关、实时控制系统等场景,用于处理如仪表显示、AI推理、实时控制等复杂任务。本文聚焦于基于共享内存与VRING的消息队列实现,深入剖析缓存一致性、内存屏障等关键问题

weixin_27006759的博客 597

【iOS】——RunLoop学习

一个线程一次只能执行一个任务,执行完毕后就会退出。do {//获取消息//处理消息} while (消息!= 退出)这种模型通常被称为Event Loop,Event loop 在很多系统和框架都有实现。例如:Node.js 的事件处理,Windows 程序的消息循环,而在macOS、iOS中就是Run Loop。简单的说RunLoop其实就是一种循环,通过这种循环得以让应用程序持续运行,让线程能随时处理事件,并在线程需要进行事件处理时忙起来,在不需要进行事件处理时闲下来。

m0_73974920的博客 2763

VisionPro脚本实战:用C#替代QuickBuild,让复杂定位项目代码更清爽

本文探讨了如何通过C#脚本重构VisionPro复杂定位项目,替代臃肿的QuickBuild架构。通过实战案例展示了脚本化开发如何减少60%代码量并提升35%运行效率,使项目更易维护。文章详细介绍了环境搭建、多模板定位重构及高级技巧,帮助开发者突破QuickBuild限制,实现更高效的视觉应用开发。

weixin_30417487的博客 502

①Modbus TCP转Modbus RTU/ASCII网关同步采集无需编程高速轻松组网

MS-A1-50X1系列作为MODBUS TCP通信的服务器进行动作。可通过MODBUS TCP 通信,将 MS-A1-50X1 系列产品通过 RS485 采集的仪器仪表之类的值作为通信数 据输出到 PLC,上位机等。

2401_89571741的博客 1398

iOS RunLoop简介

1.RunLoop和线程的关系? (1)一个线程对应一个RunLoop; (2)主线程默认有一个RunLoop; (3)子线程的RunLoop以懒加载的形式创建; (4)RunLoop存储在一个全局的可变字典里,线程是key,RunLoop是value; 2.RunLoop的运行模式 RunLoop的运行模式共有5种,RunLoop只会运行在一个模式下,要切换模式,就要暂停当前模式,重...

JGL357的博客 368

silvaco——GaN HEMT探索

上图为输出特性曲线 ,分别是在栅压为1v、3v、5v的情况下,可以看出在1v时器件处于截止状态,只有非常小近似于0的电流通过,随着栅压逐渐增大,沟道开启,产生漏极电流。上图为栅极漏电流曲线和转移特性曲线以及其提取的参数,可以看到阈值电压为=1.30249V,当栅压为0v时,Id=8.01032e-006,当栅压为5V时,Ig=3.11627e-006。albrct.n,低场迁移率模型,bn.albrct,an.albrct是albrct模型中的参数,可以由用户自己设定。lat.temp,晶格自热模型;

weixin_61913839的博客 7617

Objective-C之run loop详解

本人录制技术视频地址:https://edu.youkuaiyun.com/lecturer/1899 欢迎观看。深入理解RunLoop由 ibireme | 2015-05-18 | iOS, 技术RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理。之后会介绍一下在 iOS 中,苹果是如何利用 RunL...

秋恨雪 1814

当LightGBM推理遇上GPU:3种替代方案性能对比(含ONNX实战代码)

本文针对LightGBM官方不支持GPU推理的性能瓶颈,深度评测了RAPIDS cuML、ONNX Runtime GPU和Triton Inference Server三种GPU加速推理替代方案。通过详尽的性能对比和实战代码,为高并发、低延迟的在线预测场景提供了清晰的选型指南,帮助工程师打破推理性能枷锁,实现显著的吞吐量提升。

salt9的博客 813

ResNet改进(51):基于轴向注意力机制的改进ResNet模型

本文介绍了一种结合轴向注意力机制的改进ResNet模型。 通过在传统CNN中引入轴向注意力,我们能够在保持计算效率的同时,增强模型对图像全局上下文的理解能力。这种混合架构结合了CNN的局部特征提取优势和注意力机制的全局建模能力,在图像识别任务中表现出色。 轴向注意力机制的应用不仅限于ResNet,也可以灵活地集成到其他CNN架构中。 未来可以探索更多注意力变体,或将其应用于特定领域任务,如医学图像分析、自动驾驶等需要精确空间理解的场景。 希望本文能帮助你理解如何将注意力机制与传统CNN结合,为你的计

2401_82355416的博客 359

Runloop 的五种mode

模式类似于跑道,一个runloop同时只能在一个跑道上进行,并且模式有优先级, UITrackingRunLoopMode是UI模式,是优先级最高的模式,当runloop遇到事件的时候,会根据事件指定的模式,去切换跑到,UITrackingRunLoopMode的优先级最高,所以就切换到了这个模式上,这时候其他模式下的事件就不会被执行.场景: 当一个页面中添加了UIScrollView 同时还有一个定时器的时候,当UIScrollView 滑动的时候, 定时器是不工作的,

KLong27的博客 1646

OpenClaw进阶实战(二十一):工作流6:跨平台舆情监控与自动响应

摘要: 本文介绍基于OpenClaw构建自动化舆情监控系统,实现多平台数据采集、AI情感分析与智能预警。系统架构包含数据采集(微博/小红书/抖音)、消息队列、情感分析(SnowNLP/大模型API)、分级预警和自动响应模块。通过技能化开发(如微博API采集、小红书模拟登录)实现7×24小时监控,结合情感强度与传播速度分级处理负面舆情,形成"采集-分析-预警-处置"闭环,适用于企业私有化部署。

PeterPan的博客 299

iOS开发 - 啰嗦讲解 Runloop

写在前面的 为什么要了解 RunLoop?如果你想成为一个高级iOS开发工程师,那这是你必须了解的东西,他能帮助你更好的理解底层实现的原理,可以利用它的特性做出一些高效又神奇的功能。RunLoop这个东西已经是在各路大神的Blog里面描述和详解过很多次的了,我把它翻出来再写一遍,一来是为了让自己温故而知新,二来会重点详细解读一下当初我理解时候遇到的难点,为初、中级想要进阶的iOS开发...

Sinbad9191的博客 2836

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

iOS开发-Runloop探索

文章目录runloop源码分析 runloop runloop是属于Object Thread线程的一部分,代码就只有两个文件CFRunloop.h和CFRunloop.c https://pan.baidu.com/s/1AVF6qmJRtV8KQR5T0qf7Tg 百度网盘链接 对于我们iOS的工程来说,main函数入口即是一个runloop #import <UIKit/UIKit...

CaicaiNo.1 586

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

深入理解iOS开发之RunLoop

RunLoop属于iOS进阶开发中的一个重要技术点,本文会重点讲解我在开发过程中总结的对RunLoop的理解。RunLoop是与多线程相关的一个事件处理机制,用来调度操作和处理协调即将发生的事件。iOS Developer Library关于RunLoop的解释是,RunLoop机制的目的是保证线程在有任务的时候保持持续运行,在没有任务要处理的时候,进入休眠状态。

taylorwenzhan的博客 1471

iOS开发之Runloop和Runtime

RunLoop 对于一个iOS开发者,如果你的水平只是停留在会用API的级别,那说明你与大神还是慢慢长路,本文章大家一块学习一些深层次的东西,RunLoop和Runtime。Runloop官方文档 你肯定写过一个按钮点击事件,点击界面上的一个按钮,这个时候就会有对应的按钮响应事件发生。给我们的感觉就像应用一直处于随时待命的状态,在没人操作的时候它一直在休息,在让它干活的时候,它就能立刻响应。其实

逝水无情的博客 3233

iOS开发之Runloop

学习了关于iOS开发中Runloop的基本用法,记录下笔记。 学习阶段,如果哪部分有问题,欢迎指正,共同探讨。@Apach3

Apach3的博客 390

iOS开发-Runloop中自定义输入源Source

自定义输入源 根据苹果官方文档说明,基于端口的源(Source1)由内核自动发出信号,定制源(Source0)必须从另一个线程手动发出信号 定制源Source0 创建custom input source需要定义以下内容: 您希望输入源处理的信息。 一个调度函数(scheduler),让感兴趣的客户端知道如何联系输入源。 执行任何客户机发送的请求的处理函数(handler)。 用于使输入源无效的...

CaicaiNo.1 2727

【iOS开发】RunLoop内部实现和使用

iOS开发,RunLoop底层实现原理,RunLoop的应用,NSTimer的分析,事件源,定时器源和观察者机制

专注于苹果IOS开发和最新资讯 320

iOS 开发runLoop 机制详解

NSRunLoop机制对于iOS开发,runLoop机制还是很有必要了解一下的,最近在做一个广告图的功能正好需要了解下runtime机制问题,在查看了官方文档API以及论坛贴吧博客各位大牛的文章后,整理下关于我自己的理解和总结. 首先说介绍下NSRunLoopOSX/iOS 系统中,提供了两个这样的对象:NSRunLoop 和 CFRunLoopRef。 CFRunLoopRef 是在 CoreF

u010044221的博客 2546

ios开发之Runloop简介

RunLoop从字面上看是运行循环的意思,这一点也不错,它确实就是一个循环的概念,或者准确的说是线程中的循环。 本文一开始就提到有些程序是一个圈,这个圈本质上就是这里的所谓的RunLoop,就是一个循环,只是这个循环里加入很多特性。  首先循环体的开始需要检测是否有需要处理的事件,如果有则去处理,如果没有则进入睡眠以节省CPU时间。 所以重点便是这个需要处理的事件,在RunLoop中,需要处理的

等待化茧成蝶的专栏 753

ios 找到nsdictionary key结尾_iOS开发RunLoop详解

RunLoop概述RunLoop是什么?为什么要有RunLoop?一般来说,一个线程只能执行一个任务,执行完就退出。如果我们需要一种机制,让线程不退出,随时能处理事件,那么我们就用到了RunLoop。那么,RunLoop是什么?RunLoop又叫运行循环,内部就是一个do-while循环,在这个循环内部不断处理各种任务,保证程序持续运行。RunLoop存在的目的就是当线程中有任务的时候,...

weixin_32909875的博客 151

iOS开发线程和RunLoop

一般来讲,一个线程一次只能执行一个任务,执行完毕后线程就会退出,如果我们需要一个机制让线程能随时处理时间但并不退出,通常的代码逻辑是这样: 这就是 Event Loop框架。 runloop实际上就是一个管理其需要处理的事件和消息的对象,并提供了一个入口函数来执行上面Event loop的逻辑。线程执行了这个函数之后,就会一直处于这个函数内部“接受消息-》等待-》处理”的循环中,知道...

weixin_30372371的博客 120
上一篇: 常见问题整理及解决方案
下一篇: RAC函数响应式编程
夏目的三三吖
博客等级 码龄10年 0粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值