从底层到算法 — 2020年最全的大厂面试题

2,119 阅读19分钟

1.什么是函数式编程?

函数可以接受函数当作输入(参数)和输出(返回值)。

2.什么是ABI?

应用程序二进制接口(application binary interface,ABI) 描述了应用程序和操作系统之间,一个应用和它的库之间,或者应用的组成部分之间的低接口 。ABI不同于API ,API定义了源代码和库之间的接口,因此同样的代码可以在支持这个API的任何系统中编译

3.什么是MVC,请结合CocoaTouch说明?

4.什么是MVVM,请设计View moled需要考虑哪些?

    1. 低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model不可以不变,当Model变化的时候View也可以不变。
    1. 可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
    1. 独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xaml代码。
    1. 可测试。界面素来是比较难于测试的,而现在测试可以针对ViewModel来写。

5.swift相对于OC有哪些优点?

  • 简洁的语法:

我们不得不承认的是swift语言比OC精简,整个项目中丢掉了头文件,以及头文件的引入。

  • 报错精准:

报错的时候直接显示报错行。

  • 定义变量简单:

定义变量不用区分整型,浮点型等等,变量使用var,常量使用let。

  • 可视化互动效果:

开发工具带来了Xcode Playgrounds功能,该功能提供强大的互动效果,能让Swift源代码在撰写过程中实时显示出其运行结果。

  • 函数式编程的支持:

Swift 语言本身提供了对函数式编程的支持;

Objc 本身是不支持的,通过引入 ReactiveCocoa 这个库才可支持函数式编程。

6.oc里有多少种开辟多线程的方式

OC开线程的三种方式 ##7.多少种线程锁的写法 实现线程读写锁的四种方法

8.block的实质和原理

iOS Block原理和内存中位置

9.https的原理 为什么安全

HTTPS 的实现原理

10.谈谈事件响应链,如何响应view之外的事

iOS UI事件传递与响应者链

11.深拷贝和浅拷贝的区别

在iOS中关于深拷贝和浅拷贝以及copy属性的理解

##12.isa指针是什么,在oc中起什么用。

每个Objective-C对象都有一个隐藏的数据结构,这个数据结构是Objective-C对象的第一个成员变量,它就是isa指针。这个指针指向哪呢?它指向一个类对象(class object 记住它是个对象,是占用内存空间的一个变量,这个对象在编译的时候编译器就生成了,专门来描述某个类的定义),这个类对象包含了Objective-C对象的一些信息(为了区分两个对象,我把前面提到的对象叫Objective-C对象),包括Objective-C对象的方法调度表,实现了什么协议等等。这个包含信息就是Objective-C动态能力的根源了。

13.delegate解决了什么问题,Notification与它有什么不同?

解决对象间通信,耦合度高,易懂

14.im消息不重复 不丢失

即时通讯软件如何保证消息的不重复和不丢失

15.LLVM与Clang的区别?

LLVM是构架编译器(compiler)的框架系统

16.lang是一个C++编写、基于LLVM、发布于LLVM BSD许可证下的C/C++/Objective-C/Objective-C++编译器。那么为什么已经有了GCC还要开发Clang呢?Clang相比于GCC有什么优势呢?

其实,这也是Clang当初在设计开发的时候所主要考虑的原因。Clang是一个高度模块化开发的轻量级编译器,它的编译速度快、占用内存小、非常方便进行二次开发。

17.Class、objc的区别是什么?

深入理解objc中的类与对象

18.AFN的原理

19.死锁的理解怎么解决

资源竞争循环等待

20.开发中遇到的最大的困难,怎么解决的。如果是现在你会怎么解决。

21.arc weak原理

(1)前端编译器 ----给“拥有的”每个对象插入相应的release语句。某个方法里面创建了一个对象,前端编译器会在方法末尾自动添加release语句销毁它。类拥有的对象(实例变量/属性)在dealloc方法内释放。

(2)ARC优化器---当代码中出现多个对 retain 和release的重复调用,ARC优化器负责移出多余的 retain 和release语句。

22.@property的所有关键字。strong和weak的区别

iOS 中 weak 的实现原理

23.GCD的理解和原理

24.kvo 的原理

[详解KVO底层实现 ](www.cnblogs.com/oc-bowen/p/…)

kvc

  • 1、首先搜索setKey:方法.(key指成员变量名, 首字母大写)
  • 2、上面的setter方法没找到, 如果类方法accessInstanceVariablesDirectly返回YES. 那么按 _key, _isKey,key, iskey的顺序搜索成员名.(NSKeyValueCodingCatogery中实现的类方法, 默认实现为返回YES)
  • 3、如果没有找到成员变量, 调用setValue:forUnderfinedKey:

25.消息转发 runloop的原理。

iOS基础面试题之RunLoop篇

26. jspatch原理

JSPatch 使⽤用 Objective-C 的 runtime 让 JS 调⽤用任意的 Objective-C 的类和⽅方法。如果想要动态调⽤用 Objective-C 的任意类、任意⽅方法,恰巧 Objective-C 的 runtime 可以做到这⼀一点。那么 JSPatch 的 核⼼心就是把 JS 中的⽅方法调⽤用,转换成 Objective-C 的⽅方法调⽤用,并且 JS 和 Objective-C 之间需要进⾏行行 数据传递。

补丁下发 补丁格式替换为 __c 对需要添加或修改的⽅方法进⾏行行处理理,传递给 OC,使⽤用 runtime 处理理 调⽤用下发的 JS 函数 调⽤用补丁代码的实现 调⽤用 __c 函数 调⽤用 _OC_callI 或者 _OC_callC

27.设计模式, 路由设计模式和桥接设计

28.数据库设计

iOS数据库技术进阶

29.category和extensions的区别

category和extensions区别

30.内存优化

31.tableview 性能优化

UITableView的性能优化

32.NSMutable原理

NSDictionary和NSMutableArray底层原理

33.webview 性能体验和优化

WebView初始化慢,可以在初始化同时先请求数据,让后端和网络不要闲着。 后端处理慢,可以让服务器分trunk输出,在后端计算的同时前端也加载网络静态资源。 脚本执行慢,就让脚本在最后运行,不阻塞页面解析。 同时,合理的预加载、预缓存可以让加载速度的瓶颈更小。 WebView初始化慢,就随时初始化好一个WebView待用。 DNS和链接慢,想办法复用客户端使用的域名和链接。 脚本执行慢,可以把框架代码拆分出来,在请求页面之前就执行好。

34.自动释放池

线程、自动释放池、RunLoop

35.NSproxy是干嘛用的

NSProxy通常用来实现消息转发机制和惰性初始化资源。

反斜对角打印,取数组第n大的值,three sum

36.在KVO中,他是怎么知道监听的对象发生了变化?

37.字典的工作原理 ?怎100w个中是怎么快速去取value?

38.一个上线的项目,知道这个方法可能会出问题,在不破坏改方法前提下,怎么搞?

39.Block和函数指针的区别?

40.YYModel和AF源码

41.如何自己设计json转model

42.浅拷贝和深拷贝的区别

43.Block的循环引用、如何解决、原理

44.Block和delegate的比较

45.主线程是相对于什么而言的

46.一张图片的内存占用大小是由什么决定的

47.索引的作用

48.索引的优缺点

49.在数组中找最小的k个数

50.淘宝下拉加载更多如何优化

51.淘宝页面发送HTTP请求的过程

52.Autorelease pool的实现原理

53.消息转发机制

54.线程死锁的四个条件

55.进程和线程的区别

56.持久化

57.事务的特征

58.HTTP和HTTPS的区别?

59.cao作系统

  • 有哪些cao作系统?
  • 即时系统和非即时系统的区别?
  • 线程的几种状态?
  • 数据结构和算法
  • 手撕二叉树层序遍历
  • 手撕前K大的数
  • 几种排序算法的思想和复杂度?
  • logn的复杂度是怎么算出来的?

60.安卓和iOS系统的区别

61.iOS中有哪些常用的传值方法?

62.如何解决controller臃肿问题?

63.NSNumber是如何实现的?

64.说说实习做的SDK具体是干什么的?

65.说说从接到需求到选定技术方案整个过程?

66.变量的声明和定义有什么区别

67.声明变量会占用存储空间么?

68.变量可以声明很多次么?

69.变量可以定义很多次么?

70.sizeof和strlen的区别?

71.写一个计算最小值的标准宏

72.#define和typedef的区别

73.const是做什么的?

74.extern是干什么的?

75.static关键字有什么作用?

76.C++内存管理需要注意什么问题

77.C++的内存分区是怎么样的

78.什么是野指针

79.哪些情况下回出现野指针问题

80.什么是指针变量?什么是变量指针?

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:1012951431 不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

81.load和initilize方法的异同?

82.OC中向一个nil对象发送消息会出现问题么?

83.谈谈MVC设计模式?

84.谈谈观察者模式?

85.写一个工厂模式?

86.如果最高效的计算17 * 2?

87.找到链表的倒数第k个结点?

88.10亿个数中找最大的1000个数

89. 你平时怎么解决网络请求的依赖关系:当一个接口的请求需要依赖于另一个网络请求的结果

解析:

  • 办法1:线程:NSOperation 操作依赖和优先级

    [operationB addDependency:operationA]; // 操作B依赖于操作
    
  • 办法2:逻辑:在上一个网络请求的响应回调中进行下一网络请求的激活

90.关于RAC你有怎样运用到解决不同API依赖关系

  • 信号的依赖 使用场景是当信号A执行完才会执行信号B,和请求的依赖很类似,例如请求A请求完毕才执行请求B,我们需要注意信号A必须要执行发送完成信号,否则信号B无法执行

    //这相当于网络请求中的依赖,必须先执行完信号A才会执行信号B
    //经常用作一个请求执行完毕后,才会执行另一个请求
    //注意信号A必须要执行发送完成信号,否则信号B无法执行
    RACSignal * concatSignal = [self.signalA concat:self.signalB]
    //这里我们是对这个拼接信号进行订阅
    [concatSignal subscribeNext:^(id x) {
      NSLog(@"%@",x);
    }];
    

91. 编译链接你有了解多少

解析:这个涉及到简单知识,可参考 www.360doc.com/content/17/…

92. 简单介绍下KVO的用法

解析:首先,简单介绍下KVO的用法,先添加观察者,然后怎样实现监听的代理。关于原理,可以利用runtime的知识进行实现KVO的原理,笔者曾经实现KVO的block和delegate两种形式,可参考 iOS开发·KVO用法

93.简单概述下 KVO 的实现:

当你观察一个对象时,一个新的类会动态被创建。这个类继承自该对象的原本的类,并重写了被观察属性的 setter 方法。自然,重写的 setter 方法会负责在调用原 setter方法之前和之后,通知所有观察对象值的更改。最后把这个对象的 isa 指针 ( isa 指针告诉 Runtime 系统这个对象的类是什么 ) 指向这个新创建的子类,对象就神奇的变成了新创建的子类的实例。

原来,这个中间类,继承自原本的那个类。不仅如此,Apple 还重写了 -class 方法,企图欺骗我们这个类没有变,就是原本那个类。更具体的信息,去跑一下 Mike Ash 的那篇文章里的代码就能明白,这里就不再重复。

94. 编程题:RLE算法,编写一个函数,实现统计字符次数的功能:例如输入为aaabbccc,输出为a3b2c3。不限语言。

解析:比较简单,可以参考这个 C语言字符串压缩显示

95. 编程题:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的.

解析:思路,递归,从根节点开始,判断左右子节点是否对称,若对称,递归,若不对称,则返回NO。

96.堆和栈的区别是什么?

答:首先在操作系统中,栈的内存增长是向下的,堆是向上的,栈的内存分配是操作系统支持的数据结构,操作系统中具有专门的寄存器存储栈指针,以及有相应的硬件指令去操作栈内存分配,堆是程序员通过系统调用库函数对堆内存进行分配存储。栈内存速率比堆快,但是栈默认的大小比堆小很多,vs中一般默认为1M,但是大小可以在编译器中设置,堆内存比较大,一般会达到4G。相比来说一般大块内存会更多在堆上分配。

97.那堆为什么默认4G,是什么决定的?

答:这个大小和虚拟内存有关,应该是2^32计算的。

98.一般机器上插内存条16G,而虚拟内存只有4G,岂不是浪费?

99.一个进程的地址和物理地址之间的关系是什么?

进程上CPU,CPU能够访问到的是进程中记录的逻辑地址,如果是页式内存管理方案,则逻辑地址包括,页号和页内偏移量,页号可以在页表中查询得到物理内存中划分的页框号,页框号+CPU基址寄存器值(进程在内存中的起始地址),结果再拼接上页内偏移量就可以得到对应的实际物理地址。

100.这样有什么更快的方法去计算物理地址?

有一个TLB快表,可以去记录,但是具体机制不清楚。

101.HTTP消息的header都有哪些?

答:HTTP分为请求消息和响应消息,请求消息格式:请求方法+URL+协议版本 ;响应消息格式:状态响应码+协议版本;根据请求方式不同,消息header也不同。

102.在浏览器中输入URL,发生的事情都有什么?

输入URL后,首先URL=协议+域名+服务器上的资源位置,因为在通信子网中是通过IP为标志进行分组转发,因此需要通过DNS进行解析出IP,封装HTTP消息请求下发到传输层,在传输数据之前需要双方简历TCP链接,链接建立完成后,根据TCP协议进行首部封装,然后下发到网络层根据IP协议进行IP数据单元封装,到数据链路层根据ARP协议对IP进行转换为MAC地址,然后加帧首帧尾巴,进行帧封装,然后到物理层转为bit流进行通信传输到目的主机,自底向上进行解封装到达应用层,根据资源位置,在服务器上查询到web对象,将HTML文档加到响应消息返回给客户端浏览器。

103.HTTPS和HTTP的区别是什么?

HTTPS在HTTP明文传输的基础上加了SSL层进行加密数据传输。

104.SSL建立连接的过程是什么,说一下?

首先客户端向服务器发送自身的SSL版本以及加密参数给服务器,服务器返回自己的SSL版本和参数以及数字证书包括了服务器的公钥,客户端生成浏览器会话秘钥通过公钥进行加密返回给服务器,服务器通过私钥解密出会话秘钥,客户端再发送一个报文通知服务器以后通过该会话秘钥进行加密传输,并发送加密报文表示我方SSL链接建立完成,服务器也回复相同的表示自己也建立连接完成。

105.数字证书怎么验证?

数字证书也是别的机构颁发给网站,也是加密过的,需要客户端通过公钥对它解密来验证它的有效性合法性,是否过期等信息。

106.TCP为什么是三次握手和四次挥手

107.TCP和UDP的区别是什么?

TCP是传输控制协议,是面向字节流的可靠传输,通过分组编号,确认应答,超时重发,流量控制和拥塞控制机制保证数据分组正确有序完整的传输到接收方,UDP是用户数据包协议,不具有TCP的以上机制来保证可靠传输,是以数据报的形式发出,从最下层发出后,它认为发送成功,是不具有保序 正确和完整传输的性质。

108.P2P传输是什么?我发送数据只有你的IP,并没有你的主机号,是怎么讲数据发送到你主机?

答:我理解就是端到端传输,你首先是将数据发送到我的局域网的出口网关路由,然后进入内网,在局域网中是通过交换机进行Mac地址进行转发,识别到对应的主机。(对方不满意)

109.写二叉树对称性判断。

二叉树的遍历

110.volley的源代码,在图片缓存部分讨论了挺长时间,http中缓存机制,

111.视觉控制器的生命周期

112.多线程(NSTread、NSOPeration、GCDA+block)

113.http协议get post的区别

114.手机适配一些方案

115.真机调试、项目上线注意事项

116.静态方法是否能被重写

117.id和nill代表什么(nill和NULL的区别)

118.向一个nill对象发送消息会发生什么?

119.http中的同步和异步

120.MVC 和 MVVM 的区别。

用 MVVM 实现一个业务。VC 是入口,VC1 显示 “省” 的列表,VC2 显示省关联的 “市” 的列表,VC3 显示市关联的 “县” 的列表。VC 到 VC1,VC1到 VC2,VC2 到 VC3,VC3 再跳转到 VC。相关点在于如何设计 ViewModel 和 Model ,以及 VC3 到 VC。

121.如何编写单元测试,比如写了一个网络库,如何测试该网络库,用例怎么写的更全面一些。

122.代码从 Git 上拉下来到生成 .ipa 都有哪些过程,期间都生成了什么文件。

123.Block和Protocol的区别,Block是为了解决什么问题而使用的。

124.iOS 的设计模式。iOS 为什么没有类似于 Java 和 C 之类的 “Builder” 的构造模式。

125.冒泡、插入、快速排序的平均时间复杂度和最坏时间复杂度。

126.有时间复杂度为 O(n) 的排序吗?

127.OC语言有什么特点?和其他语言(Java、Python)的区别?

动态语言、运行时特性、消息转发机制。

128.为什么说OC是动态的?

将对象类型的确定由编译期延迟到了运行时。

129.分类与扩展及匿名分类的区别?

130.self和super的区别?(super是保留关键字,不是指针)

131.定义一个对象,它的内存大小是多少?

132.能否动态地给对象添加属性?

133.atomic和nonatomic的区别?

134.@property(atomic,strong) NSMutableArray *array,这样写能否保证线程安全?

不能,atomic只针对getter和setter方法

135.如何保证线程安全?

使用信号量。

136.编写一个函数,实现以下功能:“Float字符串 -> Float数字”

127.用过block吗?怎么解决循环引用的问题?

用weak属性

138.见过在block外面使用weak属性,然后在里面加strong的吗?为什么呢?

139.怎么自定义导航跳转

140.谈谈runtime的理解

141.谈谈runloop的理解

142.runloop有哪些状态

143.KVC的用途

144.使用method swizzling要注意什么?

145.谈对引用计数的理解

146.autoreleasepool的使用场景

147.TableView优化,怎么减少卡顿

148.copy assign retain weak关键词

149.JSON转Model

150.HTTP请求头和响应头

151.Cookie

152.NSCache

153.怎么实现LRU

154.SDWebImage

155.MVC的一些缺点

156.你知道哪些编码方式

157.算法字符串翻转

158.多线程的方式和它们的区别

159.队列和线程的关系

160.属性的关键字

161.assign可以用于OC对象吗

162.copy和strong的区别

163.weak如何实现自动赋nil

164.为什么不可变对象要用copy

165.assing可以使用在对象中吗

166.Pod update和pod install的区别

167.layoutIfNeeded和setNeedsLayout的区别

168.抓包工具抓取HTTPS的原理

169.isEquel和hash的关系

170.bitmap的结构

171.可变数组的实现原理

172.如何hook一个对象的方法,而不影响其它对象

173.如何避免if else

174.自旋锁和互斥锁的区别

175.数组cop后里面的元素会复制一份新的吗

176.数组的浅拷贝与深拷贝

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:1012951431 不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

另附上一份各好友收集的大厂面试题,进群可自行下载!