2022年iOS最新面试(底层基础)问题答案

article/2025/8/20 1:36:26

文章目录

      • Runloop
        • 1、RunLoop 的本质是什么?
        • 2、Runloop和线程是什么关系?
        • 3、Runloop的底层数据结构是什么样的?有几种 运行模式(mode)?每个运行模式下面的 CFRunloopMode 是哪些?他们分别是什么职责?
        • 4、Runloop 的监听状态有哪几种?
        • 5、Runloop 的工作流程大概是什么样的?
        • 6、Runloop 有哪些应用?
        • 7、Runloop的内核态和用户态?
      • 线程、队列、锁
        • 1、线程、队列的关系? 一个线程是否可能存在于两个队列?
        • 2、队列一定会创建线程吗?
        • 3、队列是否可以无限制创建?
        • 4、PerformSelector & NSInvocation优劣对比
        • 5、gcd 的使用,能不能取消?
        • 6、如何进行线程保活
      • GCD
        • GCD、NSOperation区别, 功能方法区别.
        • gcd queue 的区别
        • group 如何实现barrier类似的功能?
        • GCD group 如何实现同步的? (还能用什么实现?)
        • 执行一个 NSThread 任务, 如何在执行过程中让他终止?
        • iOS NSOperation 是如何终止/取消任务的?
        • 多线程,异步执行(async)一个performSelector 会执行么?如果加上 afterDelay呢?
        • GCD 实现 NSOperationQueue
        • DispatchQoS的作用

Runloop

1、RunLoop 的本质是什么?

答:本质是一个OC对象,内部也有isa指针。

2、Runloop和线程是什么关系?

答:线程和 RunLoop 之间是Key-value的对应关系,是保存在一个全局的 Dictionary 里,线程是key,RunLoop是value,而且是懒加载的。

3、Runloop的底层数据结构是什么样的?有几种 运行模式(mode)?每个运行模式下面的 CFRunloopMode 是哪些?他们分别是什么职责?

答:Runloop的底层数据结构(NSRunLoop是CFRunLoop的封装):
CFRunLoop,RunLoop对象
Mode,运行模式
Source,输入源/事件源
Timer,定时源
Observer,观察者
系统默认注册了5个Mode常用的有3个 常见的几种Mode:
Default : App的默认Mode,通常主线程是在这个Mode下运行
UITracking: 界面跟踪Mode,用于ScrollView`追踪触摸滑动,保证界面滑动时不受其他Mode影响。
Common :并不是一个真的模式,它只是一个标记,如:被标记的 Timer可以在Default模式和UITracking下运行。

基本用不到的Mode:

UIInitialization :私有的mode,App启动的时候的状态,加载出第一个页面后,就转成了Default
GSEventReceive系统的内部 Mode,通常用不到

4、Runloop 的监听状态有哪几种?

答:Entry->BeforeTimers->BeforeSources->BeforeWaiting(休眠)->AfterWaiting(唤醒)->Exit->AllActivities

/* Run Loop Observer Activities */
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {kCFRunLoopEntry = (1UL << 0),                 // 即将进入LoopkCFRunLoopBeforeTimers = (1UL << 1),          // 即将处理TimerkCFRunLoopBeforeSources = (1UL << 2),         // 即将处理SourcekCFRunLoopBeforeWaiting = (1UL << 5),         // 即将进入休眠kCFRunLoopAfterWaiting = (1UL << 6),          // 刚从休眠中唤醒kCFRunLoopExit = (1UL << 7),                  // 即将退出LoopkCFRunLoopAllActivities = 0x0FFFFFFFU         // 所有状态
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

5、Runloop 的工作流程大概是什么样的?

在这里插入图片描述

6、Runloop 有哪些应用?

答:滑动scrollview时候的mode切换,cell的图片下载 将多个耗时操作分开执行,在每次 RunLoop
唤醒时去做一个耗时任务。

7、Runloop的内核态和用户态?

答:CPU的两种工作状态:内核态和用户态(或者称管态和目态)
内核态:系统中既有操作系统的程序,也由普通用户的程序。为了安全和稳定性操作系统的程序不能随便访问,这就是内核态,内核态可以使用所有的硬件资源。
用户态:不能直接使用系统资源,也不能改变CPU的工作状态,并且只能访问这个用户程序自己的存储空间。

线程、队列、锁

1、线程、队列的关系? 一个线程是否可能存在于两个队列?

答:线程是系统调度的最小任务单位,队列是存放管理任务单位的数据结构。

2、队列一定会创建线程吗?

答:不,同步执行方式是不创建新线程的,就在当前线程嗨。

线程按执行方式分为同步、异步,按队列管理分为串行并行,这样有四种组合,加上常说的主线程主队列,那么结合执行方式就有六种组合。

同步串行,不创建线程,所以还是在当前线程一个一个做

同步并行,不创建线程,所以就算是并行,也还是在当前线程一个一个做

异步串行,开辟多一条线程,任务在新开辟的一条线程里面一个一个做

异步并行,开辟多条线程,任务在新开辟的线程里面一起做

同步主队,阻塞

异步主队,同异步串行,因为主队就是串行,但是不开辟新线程,因为主线程是全局的单例的

3、队列是否可以无限制创建?

12个iOS技术面试题及答案总结

pdf正在上传…重新上传取消0星超过10%的资源94KB

正在上传…重新上传取消

下载

答:不能,队列也是对象,要占用内存,受限于硬件资源,不能无限制创建。

4、PerformSelector & NSInvocation优劣对比

答:相同点: 有相同的父类NSObject 区别: 在参数个数<= 2的时候performSelector:的使用要简单一些,但是在参数个数 > 2的时候NSInvocation就简单一些。

5、gcd 的使用,能不能取消?

答:dispatch_block_cancel可以取消尚未执行的任务。已经在运行的,用代码中断

6、如何进行线程保活

答:想让线程不死掉的话,需要为线程添加一个RunLoop

NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
// 往RunLoop里面添加Source\Timer\Observer,Port相关的是Source1事件
// 添加了一个Source1,但是这个Source1也没啥事,所以线程在这里就休眠了,不会往下走,----end----一直不会打印
[runLoop addPort:[NSMachPort port] forMode:NSRunLoopCommonModes];
[runLoop run];
  • 1
  • 2
  • 3
  • 4
  • 5

GCD

GCD、NSOperation区别, 功能方法区别.

答:
NSThread是早期的多线程解决方案,实际上是把C语言的PThread线程管理代码封装成OC代码。
GCD是取代NSThread的多线程技术,C语法+block。功能强大。 充分利用多核,效率最高
NSOperationQueue是把GCD封装为OC语法,额外比GCD增加了几项新功能。 最大线程并发数 取消队列中的任务 暂停队列中的任务
可以调整队列中的任务执行顺序,通过优先级 线程依赖 NSOperationQueue支持KVO。 这就意味着你可以观察任务的状态属性。
但是NSOperationQueue的执行效率没有GCD高,所以一半情况下,我们使用GCD来完成多线程操作。

gcd queue 的区别

答:
GCD是取代NSThread的多线程技术,C语法+block。功能强大。
充分利用多核,效率最高 NSOperationQueue是把GCD封装为OC语法,额外比GCD增加了几项新功能。
最大线程并发数
取消队列中的任务
暂停队列中的任务
可以调整队列中的任务执行顺序,通过优先级
线程依赖
NSOperationQueue支持KVO。 这就意味着你可以观察任务的状态属性。
但是NSOperationQueue的执行效率没有GCD高,所以一半情况下,我们使用GCD来完成多线程操作。

group 如何实现barrier类似的功能?

网易iOS岗位面试真题面经

docx正在上传…重新上传取消0星超过10%的资源107KB

正在上传…重新上传取消

下载

答:barrier栅栏功能,栅栏前不管多少个异步都要执行完毕,才会执行栅栏后面的操作。
可以尝试用信号量来实现,例如A、B、C、barrier、D并发,但是希望ABC完成后D才开始。
设定线程信号量最大值为3,ABC先执行,等ABC都执行完,D才开始

GCD group 如何实现同步的? (还能用什么实现?)

答:第一串行队列,第二并行队列,第三分组,第四信号量。
串行,一个一个执行,有同步操作的效果
并行,先开一个异步线程,把多个同步线程放在该异步中执行并行
分组,dispatch_group_notify()提供了一个知道group什么时候结束的点
信号量,信号量和锁的作用差不多,可以用来实现同步方式

执行一个 NSThread 任务, 如何在执行过程中让他终止?

答://监测当前线程是否被取消过,如果被取消了,则该线程退出。在线程里面检测取消的标记,然后执行退出 if ([[NSThread
currentThread] isCancelled]) { [NSThread exit]; }

iOS NSOperation 是如何终止/取消任务的?

答:正在执行的任务,NSOperation也是不能取消的,可以考虑用一个条件来做,满足条件则执行此任务,不满足则不执行

多线程,异步执行(async)一个performSelector 会执行么?如果加上 afterDelay呢?

答:performSelector会执行,afterDelay不会执行;原因performSelector只是单纯的直接调用某函数,afterDelay是在该子线程执行一个NSTimer,注意一点:子线程中的runloop默认是没有启动的状态,要想afterDelay生效,要runloop在线程有事务的状态下跑起来,所以需要执行[[NSRunLoop
currentRunLoop] run]。

GCD 实现 NSOperationQueue

答:莫名其妙的题目,要阐述怎么用GCD缔造出NSOperationQueue吗

DispatchQoS的作用

答:线程优化,告诉系统是什么类型的任务。
user_interactive:用户交互(希望尽快完成,用户对结果很期望,不要放太耗时操作)
user_initiated:用户期望(不要放太耗时操作)
default:默认(不是给程序员使用的,用来重置对列使用的)
utility:实用工具(耗时操作,可以使用这个选项)
background:后台
unspecified:未指定
iOS 7.0 之前 优先级
priority_high:高优先级
priority_default:默认优先级
priority_low:低优先级
priority_backgroud:后台优先级

 


http://chatgpt.dhexx.cn/article/hWqmjxlV.shtml

相关文章

2019年面试必备:iOS 面试题大全(附答案)

这个栏目将持续更新–请iOS的小伙伴关注! 1、多线程的应用 2、GCD实现多个请求都完成之后返回结果 3、A、B两个int数组&#xff0c;得到A数组中B数组不包含的元素 4、事件传递链&#xff0c;页面上一个按钮&#xff0c;按钮和它的superView有一样的action,为什么只执行button的…

iOS 多线程面试题

没有比这里更全的了&#xff0c;看我就好了 面试官&#x1f603; &#xff1a;你了解进程吗&#xff1f;谈谈你对进程和线程的理解&#xff1f; 不谈进程&#xff0c;线程无从谈起。要了解什么是线程&#xff0c;我们先需要理解什么是线程。 秒懂百科 &#x1f603; 以上百科&…

2020,300道高级iOS开发面试题(最新整理)

这个栏目将持续更新–请iOS的小伙伴关注! 一&#xff1a;知名大厂iOS开发面试题篇 1、腾讯—最新iOS面试题总结 2、百度—最新iOS面试题总结 3、头条—最新iOS面试题总结 4、阿里—最新iOS面试题总结 5、美团—最新iOS面试题总结 6、某大厂—最新iOS面试题总结 7、抖音–最新i…

iOS经典面试题大全

1.INTERVIEW 共勉 作为一个开发者&#xff0c;有一个学习的氛围跟一个交流圈子特别重要&#xff0c;这是一个我的iOS交流群&#xff1a;638302184&#xff0c;不管你是小白还是大牛欢迎入驻 &#xff0c;分享BAT,阿里面试题、面试经验&#xff0c;讨论技术&#xff0c; 与2800i…

2021年,整理的iOS高频面试题及答案(总会有你需要的)

推荐阅读&#xff1a;关于iOS面试题汇总(栏目持续更新) 各位最近应该忙于跳槽与面试吧&#xff0c;毕竟金三银四&#xff0c;珍惜好机会&#xff0c;预祝大家面试顺利通过&#xff0c;迎接大厂offer。有需要资料可以私聊我了解 从输入url到页面展示到底发生了什么 1、输入地…

iOS面试题 2016版

2015-1-3 达内纪老师 GitHub&#xff0c;CSDN博客 说明&#xff1a; 最近为达内学员整理面试题。发现网上的面试题和答案基本都是抄来抄去的&#xff0c;甚至很多答案都是错误的。 所以整理了常见的面试题&#xff0c;对答案重新进行了筛选整理。 如果答案有错漏或者更好的答案…

iOS面试题系列之常见算法

iOS面试中熟悉常见算法 1、 对以下一组数据进行降序排序&#xff08;冒泡排序&#xff09;。“24&#xff0c;17&#xff0c;85&#xff0c;13&#xff0c;9&#xff0c;54&#xff0c;76&#xff0c;45&#xff0c;5&#xff0c;63” int main(int argc, char *argv[]) {int …

(2021年)iOS面试题及答案,以及添加Flutter 面试问题,Swift面试题

面试题的深入解析&#xff1b;​​​​​​​ 一&#xff0c;内存管理在实际开发中的应运。 1.UITableView的数据条数太多时会消耗内存&#xff0c;可以给UITableViewCell、UICollectionViewCell、UITableViewHeaderFooterView设置正确的复用ID&#xff0c;充分复用。 2.有…

iOS中高级面试题

https://blog.csdn.net/u014600626/article/details/102923706 iOS基础 1&#xff1a;讲讲你对atomic & nonatomic的理解 1、原子操作对线程安全并无任何安全保证。被 atomic 修饰的属性(不重载设置器和访问器)只保证了对数据读写的完整性&#xff0c;也就是原子性&am…

ios 面试题

1 为什么block要用copy修饰&#xff1f; 答&#xff1a;因为block在创建的时候&#xff0c;它的内存是分配在栈上的&#xff0c;而不是在堆区。栈区的特点是&#xff1a;对象随时有可能被销毁&#xff0c;一旦被销毁&#xff0c;在调用时就会造成崩溃。所以我们要使用copy吧它拷…

2022年 iOS面试题总结

前言 都说今年互联网行情很差&#xff0c;iOS行情更差。但到底怎么样呢&#xff0c;不能光听别人说&#xff0c;而要自己走出去看一看。我的面试的阶段基本都在3月份&#xff0c;准备的阶段则要再往前推个半个月吧。期间约到了不少一二线互联网公司面试机会&#xff0c;前期由…

iOS面试题(七)

iOS面试题&#xff08;一&#xff09; iOS面试题&#xff08;二&#xff09; iOS面试题&#xff08;三&#xff09; iOS面试题&#xff08;四&#xff09; iOS面试题&#xff08;五&#xff09; iOS面试题&#xff08;六&#xff09; iOS面试题&#xff08;七&#xff09; iOS面…

iOS基础面试题(一)

kaikaijia同学私信我,说想加群,我就建个iOS开发群,大家做技术交流和资源,群号:241048287(已满),群号2 :340957379(已满) 群号3:370041534 (已满) 有兴趣的同学可以加群,验证信息:iOS+姓名。 所有的群都已到人数上限,本着“与时俱进”精神,建了个"iOS面试&…

ios面试题总结

本篇主要针对面试题进行解析&#xff0c;会进行基础知识的总结和拓展&#xff0c;仅供参考&#xff0c;如有错误&#xff0c;欢迎指出&#xff0c;一起学习&#xff01; 一、关于Foundation框架中的问题 &#xff08;一&#xff09;NSCache & NSDictionary 1.NSDictiona…

iOS面试题大全2021(附答案)

1、简述你项目中常用的设计模式。它们有什么优缺点&#xff1f; 常用的设计模式有&#xff1a;代理、观察者、单例。 &#xff08;1&#xff09;单例&#xff1a;它是用来限制一个类只能创建一个对象。这个对象中的属性可以存储全局共享的数据。所有的类都能访问、设置此单例…

iOS 中高级面试题(附答案)

RunLoop 1、什么是 RunLoop? RunLoop 作用有哪些&#xff1f; RunLoop 可以称之为运行循环&#xff0c;在程序运行过程中循环做一些事情&#xff0c;如果没有 RunLoop 程序执行完毕就会立即退出&#xff0c;有 RunLoop 程序会一直运行&#xff0c;并且时时刻刻在等待用户的输…

安装MyBatis教程

简单安装MyBatis教程 1. 介绍 MyBatis简介 1&#xff09; MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架 2&#xff09; MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集 3&#xff09; MyBatis可以使用简单的XML或注解用于配置和原…

mybatis简明教程

mybatis MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射&#xff0c;本文将让您快速掌握mybatis开发 一&#xff1a; 简介 一只被烤黑了的鸟 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBa…

Mybatis教程-实战

1.从JDBC谈起 1.1.使用IDEA创建maven工程 1.2.引入mysql依赖包 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.32</version> </dependency>1.3.准备数据 创建数据库&a…

SpringBoot使用Mybatis教程

文章目录 新建SpringBoot项目引入mybatis依赖如何使用mybatis&#xff1f;1.配置mybatis①.数据库配置②.mybatis相关配置 2.使用mybatis①.创建JavaBean②.创建mapper1).使用注解方式2&#xff09;.使用xml方式 ③.调用 新建SpringBoot项目 本文所使用的代码编辑器为IntelliJ…