iOS高级开发面试题合集(一)

4,577 阅读36分钟

image.png

这个栏目将持续更新--请iOS的小伙伴关注!

(答案不唯一,仅供参考,文章最后有福利)

知名大厂iOS开发面试题篇

一:腾讯—最新iOS面试题总结

关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教。主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧。

腾讯

一面

1、介绍一下实习的项目,任务分工,做了哪些工作?介绍实习内容
2、网络相关的:项目里面使用到什么网络库,用过ASIHTTP库吗
3、断点续传怎么实现?需要设置什么?
4、在杭州HTTP请求服务器响应快,可能离服务器距离近,而在深圳访问就很慢很慢,会是什么原因?如果用户投诉,怎么分析这个问题?
5、HTTP请求的哪些方法用过?什么时候选择get、post、put?
6、TCP建立连接的过程,断开连接的过程,为什么是四次握手?
7、项目里面的数据存储都用了哪些?知道iOS里面有哪些数据存储方法?什么时候该用哪些方法存储?
8、MVVM如何实现绑定
9、block和通知的区别,分别适用什么场景
10、算法。连续问了好几个,都是数组,层层递进的,但是我忘了,只记得最后是找出数组中重复的数字
11、进程和线程的区别
12、程序在运行时操作系统除了分配内存空间还有什么
13、进程间通信的方式
14、如何检测应用是否卡顿
15、发布出去的版本,怎么收集crash日志?不使用bugly等第三方平台或者这些第三方平台是怎么收集crash日志的?
16、在block里面使用_property会造成循环引用吗?怎么解决?除了使用self->_property,可以使用valueforkey来访问吗 在block里面可以修改它的值吗setvalueforkey?可以修改它的值,可以用valueforkey来解决,显式的的使用self,block外先持有self的弱引用。

二面

1、OC中对象的结构
2、多态
3、Ping是什么协议
4、知道MTU吗
5、ARC和MRC的本质区别是什么?
6、NSThread,GCD,NSOperation相关的。开启一条线程的方法?线程可以取消吗?
7、子线程中调用connection方法,为什么不回调?因为没有加入runloop,执行完任务就销毁了,所以没有回调。
8、MVC和MVVM的区别
9、了解哪些设计模式
10、存一个通讯录,包括增删改查,用什么数据结构
11、autorelease变量什么时候释放?手动添加的是大括号结束的时候释放,系统自动释放是在12、当前runloop循环结束的时候
13、那子线程中的autorelease变量什么时候释放?
14、子线程里面,需要加autoreleasepool吗
15、GCD和NSOperation的区别?
16、项目里面遇到过死锁吗?怎么解决?数据库访问本来就是线程安全的,不会造成死锁啊。什么是死锁?
17、Viewcontroller的生命周期?
18、在init方法里面,设置背景颜色,会生效吗 会生效。为什么会?
19、WWDC2016公布了哪些新特性?对苹果系列的最新特性有关注吗
20、看过哪些源码,讲讲思路
21、两个链表找第一个相同结点
22、字符串旋转
23、找链表的倒数第k个结点
24、把一个链表比某个值大的放在左边,比它小的放在右边
25、二叉树的中序遍历,非递归

二:百度—最新iOS面试题总结

关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教。主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧。

百度

一面

1、iOS基础知识

2、Python基础知识,大概是多线程,线程安全,集合类,JVM,类相关知识等。

3、iOS一些源码的阅读

4、优秀的第三方框架源码阅读

5、GLSurfaceView的相关知识,OpenGL,Shader,绘制流程。

6、询问当前做的项目,以及到具体的实现和优化。

7、多进程间的通讯,Binder机制。

8、询问看过哪些框架源码,EventBus,Volley讲了一下。

二面

1、Delegate 、Notification和KVO比较各自的优缺点

2、在一个UI的正中间实现一个正方形的红色视图有几种方式?

3、手触碰到屏幕的时候,响应机制是怎样的?第一响应者是谁?追问 UIView和UIResponse的关系是什么?

4、UIViewController的生命周期是什么?追问 UIViewController 只alloc而没用到的时候,

5、UIViewController 的view是否加载了?如果没有加载那什么时候加载?
直接用UILabel和自己用DrawRect画UILabel,哪个性能好?为什么?哪个占用的内存少?为什么?

6、AFNetworking是否支持ipv6?

7、项目采用64位,为什么要用64位?怎么修改成64位?i386是什么?他们有什么关系?

8、iOS的应用程序有几种状态?追问,退到后台代码是否可以执行?双击home键,代码是否可以执行?

9、一般使用的图标内存为多大?比如200×300的图片,内存应该占用多少比较合理?

10、说说你对内存泄漏的看法,追问,block为什么容易引起内存泄漏?

11、[object copy]是浅拷贝还是深拷贝?为什么是浅拷贝?copy是实现了哪个协议?

12、Images.xcassets和直接用图片有什么不一样?

三面
全是问得iOS方面的问题,问得真的很细,需要基础很扎实,对各个机制真的足够理解,不然确实有点难回答。

1、内存管理方面的

2、多线程

3、各种队列

4、线程锁

5、MVVM
就是考察一下我iOS方面的能力到底是否有水分吧。问得很细,确实需要基础足够扎实才行。

三:头条—最新iOS面试题总结

关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教。主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧。

头条

一面

1、自我介绍

2、项目相关

3、怎么自定义导航跳转

4、谈谈runtime的理解

5、KVC的用途

6、使用method swizzling要注意什么?(进行版本迭代的时候需要进行一些检验,防止系统库的函数发生了变化)

7、谈对引用计数的理解

8、谈谈runloop的理解

9、runloop有哪些状态

10、autoreleasepool的使用场景

11、TableView优化,怎么减少卡顿

12、copy assign retain weak关键词

13、JSON转Model

14、代码布局

15、多屏幕适配

16、HTTP请求头和响应头

17、Cookie

18、NSCache

19、自己设计一个缓存器

20、怎么实现LRU

21、SDWebImage

22、二叉树先序遍历(递归和非递归)

二面

1、MVC的一些缺点

2、讲一讲其它架构

3、你知道哪些编码方式

4、算法字符串翻转

5、多线程的方式和它们的区别

6、队列和线程的关系

7、一道线程安全的题

8、有哪些锁

9、属性的关键字

10、assign可以用于OC对象吗

11、copy和strong的区别

12、weak如何实现自动赋nil

13、为什么不可变对象要用copy

14、assing可以使用在对象中吗

15、Pod update和pod install的区别

16、layoutIfNeeded和setNeedsLayout的区别

17、抓包工具抓取HTTPS的原理

18、isEquel和hash的关系

19、bitmap的结构

20、可变数组的实现原理

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

22、如何避免if else

23、自旋锁和互斥锁的区别

三面

1、介绍项目,主要介绍自己强项一点的地方

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

3、数组的浅拷贝与深拷贝

4、TCP为什么是三次握手和四次挥手

头条一直都是视频面,而且是一条龙服务。总体来说感觉不错,反正主要就是需要基础足够扎实;

四:阿里—最新iOS面试题总结

关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教。主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧。

阿里

一面

1、介绍项目

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

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

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

5、Block和函数指针的区别?

6、性能优化

7、YYModel和AF源码

8、如何自己设计json转model

9、架构

他们的面试官好像都爱问一下底层的东西,比如这次面试上来机会问我KVO的问题。
问题【1】,看着好像很吊的样子,仔细一样不去思考,可能还真不是太了解,
问题【2】,这个就是纯纯的数据结构的问题了。
问题【3】,这个就是iOS的runTime的问题了,要只要isa,和一些swizzling技术
问题【4】,就是看你了解有多广泛了。

二面

1、浅拷贝和深拷贝的区别

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

3、Block和delegate的比较

4、kvo的实现原理

5、Autorelease pool的实现原理

6、消息转发机制

7、线程死锁的四个条件

8、进程和线程的区别

9、持久化

10、事务的特征
中途还讨论了Masonry的约束应该写在哪里,我说应该写在layoutSubViews,他说会调用多次,然后争论了一会儿

三面

主要问了项目的一些东西 和给一些场景问我如何实现

自我介绍 介绍一些项目难点

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

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

索引的作用

索引的优缺点

在数组中找最小的k个数

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

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

介绍一下MVVM

知道哪些设计模式

三面面试官主要就聊了一些具体场景问题和一些基础,基础应该是没太大问题。

五:美团—最新iOS面试题总结

关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教。主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧。

美团

一面

1、简历上写的项目问了一遍,然后开始问知识点。

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

3、视觉控制器的生命周期

4、数据库

5、多线程(NSTread、NSOPeration、GCDA+block)

6、http协议get post的区别

7、手机适配一些方案

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

9、静态方法是否能被重写
这些大概聊了1个半小时,开始的时候还有些紧张,慢慢聊开了,就好多了,面试官的语速有点快,老是需要面试官重复一遍,我也不经意间语速也变快了,不过能看出来面试官还是很厉害的。

二面

1、id和nill代表什么(nill和NULL的区别)

2、向一个nill对象发送消息会发生什么?

3、http中的同步和异步

4、MVC 和 MVVM 的区别。
用 MVVM 实现一个业务。VC 是入口,VC1 显示 “省” 的列表,VC2 显示省关联的 “市” 的列表,VC3 显示市关联的 “县” 的列表。VC 到 VC1,VC1到 VC2,VC2 到 VC3,VC3 再跳转到 VC。相关点在于如何设计 ViewModel 和 Model ,以及 VC3 到 VC。
如何编写单元测试,比如写了一个网络库,如何测试该网络库,用例怎么写的更全面一些。
代码从 Git 上拉下来到生成 .ipa 都有哪些过程,期间都生成了什么文件。
最近读过哪些书,看过哪些框架,有什么收获。
谈到 JSPatch,问 JSPatch 是如何处理 Block 的。
自己擅长的地方。
遇到过什么样的挫折。

新增二面被问到的问题:如果没有instruments,该如何检测memory leak, zombie object 之类的问题。

三面

1、iOS是如何进行资源管理的。

2、Python比较重要的几个特性

3、网络五层结构,每一层协议,由于我网络不是很好,还问了一些其他的问题(例如MAC地址和ip地址的区别等)。

先谈了下前两面的感受和问题,又和面试官聊到了单例和全局变量的区别。
Block和Protocol的区别,Block是为了解决什么问题而使用的。
iOS 的设计模式。iOS 为什么没有类似于 Java 和 C 之类的 “Builder” 的构造模式。
冒泡、插入、快速排序的平均时间复杂度和最坏时间复杂度。

堆排序。
有时间复杂度为 O(n) 的排序吗?
最近从 stackOverFlow 上解决过的问题,读过的开源框架,读过的书,业余兴趣,最有成就感的事情。

六:大厂—最新iOS面试题总结

关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教。主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧。

面试题

  • 1.详细描述一下UI View与 ALAyer的关系draw Rect一定会影响性能吗? UI Dynamics与UIKit Animation的最本质区别是什么?
  • 2.如何用 UllmageView显示超大分辨率的图?如果要支持缩放呢?
  • 3.了解 fishhook吗?说说为什么 fishhook不能修改非动态连接库中的符号?
  • 4.C++调用虚方法与 Objective-C发消息有什么区别?
  • 5.了解 placement new吗? Objective-C中如何实现这个功能
  • 6.如何在ARC环境下用C++标准库容器来管理Objective-C对象?
  • 7.id、sef、 super它们从语法上有什么区别?
  • 8.isa是什么?是指向Cass对象本身的指针吗?
  • 9.block修改捕获变量除了用 block还可以怎么做?有哪些局限性?
  • 10.NSDictionary与 NSHashTable有什么区别,它们的使用场景是怎样的?
  • 11.用过Swit吗?如何评价 String index的设计?
  • 12.假设 iPhone上有一个与服务器的TCP连接,此时 iPhone忽然断网,服务器能在短时间内知会 iPhone的离线吗?
  • 13.为什么 Wireshark不能直接抓取SSL的原始数据?
  • 14.backtrace是在用户态实现的吗?能否讲讲实现它的大致思路?
  • 15.malloc的指针 double free产生的异常与访问freed指针有可能产生的异常有什么区别?为什么访问 freed指针不一定产生异常?
  • 16.RunLoop是一个不停歇在运行的死循环吗?为什么?
  • 17.看过 runtime的源码吗?源码中常有的fastpath、 flowpath是什么?
  • 18.runtime中 SideTable(不是 SideTable)存在的意义是什么
  • 19.Objective-C是如何保证系统升级后的AB稳定性的?

七:抖音--最新iOS面试题总结

关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教。主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧。

一面

  1. 最近公共父节点(两个节点,都可能为null,都可能不在树上。)
  2. 反转链表(常规题)
  3. HTTP了解吗?HTTP2.0介绍下
  4. iOS9-13,每个版本讲一个特性
  5. 怎么实现多个任务执行完后,再统一处理(应该是同步阻塞、栅栏函数、调度组)
  6. 不让用SDWebImage,如何实现类似逻辑 (自己设计图片请求和缓存,简单讲了SDWebImage的思路)
  7. 每个TableViewCell都有一个UIImageView要加载图片,如果没有缓存,有五个Cell请求一个url,同时发请求肯定是不实际的,如何处理?
  8. 微信TableView滑动的时候,动图是不动的,为什么?(Runloop的Mode决定的)
  9. 有了解过WebSocket吗?

二面

  1. 如何不试用递归,打印所有一个UIView所有的subviews
  2. 设计一个图片缓存系统,并代码实现
  3. 介绍基于LLVM/Clang的静态分析
  4. 七层协议栈
  5. HTTP是哪一层的协议
  6. HTTP常见的返回码有哪些?
  7. HTTP除了GET、POST还有哪些?(UPDATE、DELETE、HEAD)
  8. HTTPS介绍一下
  9. HTTPS能防止中间人攻击吗?
  10. TCP和UDP的区别
  11. 线程和进程的区别
  12. 线程之间如何进行通讯
  13. 不使用gcd,如何保证线程安全?
  14. iOS有哪些多线程方式?(NSOperation、NSThread、GCD)
  15. 同步和异步有什么区别?
  16. 串行队列和并行队列有什么区别?
  17. 队列和线程的关系
  18. 死锁是怎么产生的?

三面

  1. 合并排序链表
  2. HTTPS用的对称加密还是非对称加密?
  3. TCP的慢启动,快恢复介绍下
  4. 客户端发送网络请求,到拿到响应的整个过程 (类似打开一个网页的过程)
  5. 接上题,如果DNS解析的时候,某个ISP服务器没有了,这时候逻辑是怎样的?
  6. 介绍了下字典转模型的设计+夜间模式的设计
  7. 为什么不用成熟的字典转模型的三方?有了解过吗?
  8. 夜间模式有什么缺点,能怎么优化?
  9. 锁有哪些?
  10. 数据存储,怎么存的(FMDB)
  11. 线程安全错误是怎么出现的?

八:拼多多--最新iOS面试题总结

关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教。主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧。

一面

  1. JSON转模型如何实现;夜间模式;播放器架构设计

  2. 请求的过程

  3. 服务端返回格式除了json还有其他的吗?

  4. 哪些OC对象是线程安全的

  5. 为什么要在主线程更新UI

  6. 如何保证OC容器在多线程下的数据安全性

  7. SDWebImage的内存怎么设计的,更新原则是什么

  8. 两个算法题:

    1. {}判断括号匹配性
    2. 只有一种括号,计算最少加多少个括号,使其满足匹配

二面

  1. +load和+initialize怎么理解的,什么时候会被调用,分别讨论父类重写而子类没重写的情况
  2. 怎么理解OC的动态性
  3. 介绍下消息转发机制,说一下这些过程中用到的系统api
  4. 怎么理解Block的
  5. Block的变量截获机制
  6. __block的实现原理
  7. 内存管理机制
  8. 用户点击屏幕,系统是怎么找到一个view并决定由它来响应事件的

九:快手--最新iOS面试题总结

关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教。主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧。

  • 一面
  1. iOS反射机制
  2. iOS的timer和CADisplay的区别
  3. 二叉树,二叉平衡树,AVL,红黑树,B树的区别
  4. 二叉树公共节点
  5. 随机数生成,真随机数和伪随机数
  6. 不用第三者,怎么交换两个数
  7. 1000个瓶子,里面有1瓶毒药,只有10只老鼠,老鼠吃了之后一星期会死亡,怎么测试。
  • 二面
  1. UI的渲染步骤,视图打包流程,cpu和gpu工作,为什么要双缓冲区
  2. 图片怎么显示的,以及图片缓冲区
  3. NSObject结构体里面有什么,大小为什么是16字节
  4. KVO怎么实现,_会不会触发,成员变量会不会触发,kvc+成员变量会不会触发,不用setter怎么触发kvo
  5. 操作系统内存布局,有什么区
  6. 一个OC对象的内存布局
  7. 滑动优化怎么搞
  8. 什么是runtime,什么是runloop,有几种mode
  9. NSObject的内存布局
  10. isa指针和super指针
  11. 元类是什么
  12. 所有OC对象都继承与NSObject吗,id是什么
  13. SDWebImage的清除缓存策略
  14. block是什么
  15. LRU算法怎么实现
  16. Swift和OC的方法调用
  17. 两个链表的公共结点
  18. 链表中环开始的地方,原理说出来
  19. 项目里面最体现你技术的点。
  • 三面

1.什么是hash

2.hash的具体实现,程h序里面一个对象怎么通过hash定位到具体的内存区。

3.hash数组扩容

4.一个天平,4个砝码,能秤出多少种重量。

十:虎牙--最新iOS面试题总结

关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教。主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧。

  • 一面
  1. 项目架构,项目是自己写的吗
  2. fps是怎么计算的
  3. 除了用cadisplay,还有什么方法吗
  4. kvo怎么实现
  5. leaks怎么实现
  6. 如何代码实现监听僵尸对象
  7. imageWithName什么时候发生编解码,在什么线程
  8. isa指针里面有什么
  9. 消息发送和消息转发流程
  10. 函数里面的参数怎么存储
  11. oc一个空函数里面有参数吗
  12. 他们存在栈还是寄存器
  13. 红黑树等查找时间复杂度
  14. nsdictionary的实现
  15. iOS的各种锁
  16. 如何实现dispatch once,要考虑什么问题
  17. 同一线程里面使用两个@synconize会怎么样,是递归锁还是非递归锁
  18. 如何增加按钮点击范围
  • 二面
  1. 说一下ARC
  2. autoreleasepool可以用来干嘛
  3. 里面的对象什么时候释放,是出来就释放吗
  4. 消息转发可以用来干什么
  5. runloop是干什么,你用来干什么了
  6. 说一下C++多态和虚函数表
  7. TCP如何保证数据传输完整性
  8. TCP为什么三次握手
  9. http和https,全程都是非对称加密吗
  10. 开放性问题,很多乱序数据过来,你要怎么考虑排序方法的设计
  11. 对RxSwift的看法,有用过吗?
  • 三面
  1. iOS对象指针大小
  2. 对象分配到堆还是栈
  3. http怎么区分header和body
  4. 多线程可以访问同一个对象吗,多进程呢
  5. 视频pts和dts
  6. 视频丢帧丢哪个好点
  7. iOS各种锁的性能,琐是毫秒级别还是微妙级别
  8. http请求是异步还是同步
  9. 怎么看待rn和flutter

十一:iOS面试--最新快手iOS面试题

背景

面的是快手X3岗位,视频面试,不支持周末,但是可以选择晚上时间。视频面试是通过牛客网进行的,以下是记下来的各轮面试题,对于一些iOS基础知识就不做解答了。

一面

1、用递归写一个算法,计算从1到100的和。

1.  func sum(value: Int) -> Int {
2.      if value <= 0 {
3.          return 0
4.      }
5.      var number = value
6.      return value + sum(value: number - 1)
7.  }
8.  // 计算过程
9.  let result = sum(value: 100)
10. print(result)
11. 复制代码

写完算法之后又围绕着问了几个问题,都是算法基础:

  • 算法的时间复杂度是多少
  • 递归会有什么缺点
  • 不用递归能否实现,复杂度能否降到O(1)

2、property的作用是什么,有哪些关键词,分别是什么含义?

3、父类的property是如何查找的?

4、NSArrayNSDictionary应该如何选关键词?

5、copymuteCopy有什么区别,深复制和浅复制是什么意思,如何实现深复制?

6、用runtime做过什么事情?runtime中的方法交换是如何实现的?

7、讲一下对KVC合KVO的了解,KVC是否会调用setter方法?

8、__block有什么作用

9、说一下对GCD的了解,它有那些方法,分别是做什么用的?

10、对二叉树是否了解?

面试官是想接着问这方面的问题的。我当时说了不了解,然后就没有后续了。

二面

1、ARC和MRC的区别,iOS是如何管理引用计数的,什么情况下引用计数加1什么情况引用计数减一?

2、在MRC下执行[object autorelease]会发生什么,autorelease是如何实现的?

3、OC如何实现多继承?

这个当时没有答好。其实借助于消息转发,protocol和类别都可以间接实现多继承。

4、对设计模式有什么了解,讲一下其中一种是如何使用的。

5、有没有哪个开源库让你用的很舒服,讲一下让你舒服的地方。

6、一张100*100,RGBA的png图像解压之后占多大内存空间。

5、算法题

题目:给定一个个数字arr,判断数组arr中是否所有的数字都只出现过一次。

这个并没有要求写出来,说是提供思路就行了。我当时给的方案是在便利数组的时候,用一个字典把便利的元素存起来,如果在后面的便利过程中新元素在字典中存在过就说明,有重复数字出现。时间复杂度是O(n)。

当时也问了有没有办法进行优化,我当时想到了将数组转成Set,然后和原数组比较,两个集合的数量是否变化。

7、因为我跟他介绍自己Swift用的多一些,然后问了些Swift跟OC的区别,各自的优缺点。

8、为什么离职,有什么职业规划。

三面

1、给定一个Int型数组,用里面的元素组成一个最大数,因为数字可能非常大,用字符串输出。

1.  输入: [3,30,34,5,9]
2.  输出: 9534330
3.  复制代码

这个是leetcode的179题,难度中等。面试官让先说思路,再去做题。事先说一下这个题我没有做过。当时的思路是用冒泡法进行排序,排序的前提是将较少位数的数字进行循环补齐,例如3和30的比较,变成33和30的比较,34和4的比较变成34和44的比较,然后将结果从大到小整合成字符串输出。

但是做题是却发现没那么简单,位数的补齐对于2位和3位数的比较还需要求位数的最小公倍数,将他们都转成6位数才能比较。在挣扎了5分钟做了就做罢了。

后来再去做这道题,其实这就是一个排序而已,只不过他的规则是按高位优先级更高的原则,而这一点跟字符串的比较保持一致,如果再加一些Swift的高阶函数,就可以写成:

1.  func largestNumber(_ nums: [Int]) -> String {
2.      let sort = nums.map {"($0)"}.sorted { (lStr, rStr) -> Bool in
3.          return lStr + rStr > rStr + lStr
4.      }
5.      let result = sort.joined()
6.      if result.prefix(1) == "0" {
7.          return "0"
8.      } else {
9.          return result
10.     }
11. }
12. 复制代码

image.png 2、项目中有这么一个方法func findfile(dir: String suffix: String) -> [String] ,可以通过输入文件夹目录,和后缀检索出所需的文件。

例如需要在某个文件中检索txt文件或者mp4文件,那就传入dir和suffix就行了。现在又有一些需求,例如需要检索utf8格式的txt或者h264编码的mp4,也会有一些例如查找最近一周更新过的文件这样的需求,你如何优化这个类,让它满足这些情况?

我首先想到的是这么多需求不可能一个方法就完成,需要根据不同场景拆出不同的方法,但是这些同属于文件操作,会有一个共同使用的方法就是检索文件。这个方法需要传入文件目录,然后递归的返回当前目录所有文件路径。外部不同场景的调用逻辑就用一个enum完成,不同值对应相同范围的不同种类。

面试官比较关注内部共用的文件检索怎么写,他说子文件如果过多怎么办,如何优化。我有点懵,查找文件至少是要遍历一遍的,子文件过多,这个应该是没法优化的啊。中间卡了一段时间,后来他给了提示说是不是可以用block实现,将文件路径返回出去,由外部决定当前文件是否可用,最终外部的调用类是这个样子。

1.  //我的方案
2.  //func findDir(_ dir: String) -> [String]
3.  //block方案
4.  func findDir(_ dir: String, block: ((String) -> Bool))
5.  复制代码

我想来确实没毛病,用block返回内容至少不会将该目录的所有文件都由一个对象持有,而前面一堆的铺垫其实也都是为验证block方案的好处。

其实事后想下这个问题没啥难的,这种写法自己也有写过,但当时就是没想起来,可能前面一圈的铺垫给我带偏了吧,说亏也不亏,以后多多努力吧。

总结

整体来看,快手的面试题跟我在别处看到的iOS面试题对比要简单些。一面主要是基础知识,二面考察更全面一些,更多让自己谈一些对技术的理解,三面则是更偏实践一些。

算法虽然三轮都有,但相对比较简单,即使写不出来,有思路也是可以的。当然写出来肯定是加分项,所以大家准备面试时,应该都看一下。算法相关的,排序,数组,二叉树,这几类是重点。

十二:字节跳动最新iOS开发面试题

序言

疫情基本控制,同时面试也渐渐开始了,以下iOS面试题仅供参考,毕竟面试是不可控的,但懂得越多,自然机会越大!

字节一面内容:

1、 自我介绍

2、 介绍一下简历中的一个项目

3、 面向对象的三个要素

4、 多态?

5、 Java,python,OC运行效率孰高?

6、 Property,其中copy如何?

7、 Property(nonatomatic, copy) NSMutableArray有什么问题

8、 Copy和MutableCopy的区别

9、 解释下类别,原理

10、解释下封装,重载;

11、 OC存在多重继承吗?

12、了解表视图吗,解释一下复用原理

13、说明一下表视图的滑动卡顿的优化方法

14、viewDidLoad和viewDidAppear的调用时机(一次和多次的区别);

15、页面间的传值方式有哪些(公有属性,公有方法和协议,block传值,通知,extern全局变量传值,NSUserDefault简单数据存储传值);

16、通知和delegate的区别?

17、 通知的发送和接收是否在同一线程?

18、HTTP和HTTPS区别?

19、OC中多线程一般有几个方案?

20、了解NSURLConnection和Session吗?

21、说一下NSURLSession具体的实现原理

22、http的头部的几个码。;

23、编程题:实现一个二叉树的倒置。

字节二面内容:

1、老虎吃羊问题。(博弈论,老虎要吃羊,假设所有老虎是理智的,即首先为了生存,其次为了饱腹,老虎吃了羊后会变成羊,同样会被其他老虎吃掉。现在,N只老虎和1只羊,请问N为多少时,老虎们会吃羊。动态规划问题,奇数吃,偶数不吃。)

2、青蛙跳格子,斐波拉契数列;青蛙跳格子,斐波拉契数列;

3、熟悉使用什么框架?

4、如果让你自己实现SDWebImage的二级存储机制,你如果实现?

5、@autorelease{ NSString s;}和NSString s;有什么区别?

6、说一下你对autorelease的理解。

7、说一下对于http的理解?

8、http的返回状态码有了解吗?

9、为什么说http是无状态的?

10、为什么不用原生的APNS技术实现呢?

11、了解GCD吗?

12、说一下dispatch_group_t和dispatch_barrier_sync的区别吗?

13、了解NSOperation吗?

14、了解NSOperationQueue吗?

字节三面内容:

1、 算法题:求只有三项元素的数组中的顺序排列,时间复杂度要求O(n);

2、 说一下你对OC程序编译和连接方面的理解?

3、 说一下内存管理相关的操作?

4、 说一下响应链的原理?

5、 追问:hitTest有尝试过重写吗?

6、 http, session和cookie有了解过吗;

7、 线程和队列的关系?

8、 CALayer和UIView了解吗?

十三:iOS高级面试,各大厂以及小公司的面试题!

前言

近期的iOS面试求职算是经历了一波小高潮,话不多说,直接切入正题,下面是我总结的2020某些大厂以及小公司的面试题!

目录

  • 1、iOS 基础题
  • 2、iOS 实战题
  • 3、网络题
  • 4、计算机系统题
  • 5、设计模式题
  • 6、架构 & 设计题
  • 7、数据结构&算法题

1、iOS 基础题

1,分类和扩展有什么区别?可以分别用来做什么?分类有哪些局限性?分类的结构体里面有哪些成员?

2,讲一下atomic的实现机制;为什么不能保证绝对的线程安全(最好可以结合场景来说)?

3,被weak修饰的对象在被释放的时候会发生什么?是如何实现的?知道sideTable么?里面的结构可以画出来么?

4,Autoreleasepool 所使用的数据结构是什么? AutoreleasePoolPage 结构体了解么?

5,讲一下对象,类对象,元类,跟元类结构体的组成以及他们是如何相关联的?为什么对象方法没有保存的对象结构体里,而是保存在类对象的结构体里?

6,iOS 中内省的几个方法? class 方法和 objc_getClass 方法有什么区别?

7,RunLoop的作用是什么?它的内部工作机制了解么?(最好结合线程和内存管理来说)

8,哪些场景可以触发离屏渲染?(知道多少说多少)

2、iOS 实战题

1,有哪些场景是NSOperation比GCD更容易实现的?(或是NSOperation优于GCD的几点,知道多少说多少)

2,App 启动优化策略?最好结合启动流程来说(main()函数的执行前后都分别说一下,知道多少说多少)

3,App 无痕埋点的思路了解么?你认为理想的无痕埋点系统应该具备哪些特点?(知道多少说多少)

4,你知道有哪些情况会导致app崩溃,分别可以用什么方法拦截并化解?(知道多少说多少)

5,你知道有哪些情况会导致app卡顿,分别可以用什么方法来避免?(知道多少说多少)

3、网络题

1,App 网络层有哪些优化策略?

2,TCP为什么要三次握手,四次挥手?

3,HTTPS的握手流程?为什么密钥的传递需要使用非对称加密?双向认证了解么?

4,HTTPS是如何实现验证身份和验证完整性的?

5,如何用Charles抓HTTPS的包?其中原理和流程是什么?

4、计算机系统题

1,了解编译的过程么?分为哪几个步骤?

2,静态链接了解么?静态库和动态库的区别?

3,static和const有什么区别?

4,什么时候会出现死锁?如何避免?

5,有哪几种锁?各自的原理?它们之间的区别是什么?最好可以结合使用场景来说

5、设计模式题

1,除了单例,观察者设计模式以外,还知道哪些设计模式?分别介绍一下

2,iOS SDK 里面有哪些设计模式的实践?

3,设计模式的成员构成以及工作机制是什么?

6、架构 & 设计题

1,MVC和MVVM的区别?MVVM和MVP的区别?

2,面向对象的几个设计原则了解么?最好可以结合场景来说。

3,可以说几个重构的技巧么?你觉得重构适合什么时候来做?

4,你觉得框架和设计模式的区别是什么?

5,看过哪些第三方框架的源码,它们是怎么设计的?设计好的地方在哪里,不好的地方在哪里,如何改进?(这道题的后三个问题的难度已经很高了,如果不是太N的公司不建议深究)

7、数据结构&算法题

1,链表和数组的区别是什么?插入和查询的时间复杂度分别是多少?

2,哈希表是如何实现的?如何解决地址冲突?

3,排序题:冒泡排序,选择排序,插入排序,快速排序(二路,三路)能写出那些?

4,链表题:如何检测链表中是否有环?如何删除链表中等于某个值的所有节点?

5,数组题:如何在有序数组中找出和等于给定值的两个元素?如何合并两个有序的数组之后保持有序?

6,二叉树题:如何反转二叉树?如何验证两个二叉树是完全相等的?

结语

iOS面试中刷题只是一方面准备,但是,好的面试机会,离不开技术的支持,在找工作的同时,不要忘记提升自身技术,希望求职中的iOS开发者,找到一份自己满意的工作!

十四:【iOS面试】知名互联网公司iOS面试题

猿辅导 3.2

  1. 组件化架构介绍?
  2. WKWebView白板问题?如何收到WKWebView崩溃?OCJS如何交互?如何保证JS收到OC执行成功的信息?(交互可靠性)
  3. App crash信息收集,以及如何保证app不崩溃?
  4. 日志系统构建?实时上传日志与延时上传?
  5. Swift如何实现KVO?
  6. GCD实现最大线程并发数?(使用dispatch_semaphore)、手动实现队列最大并发
  7. 算法:
  • 删除排序链表中的重复元素
  • 整型字符串相加(考虑进位问题)

好未来 3.4

  1. For in循环内增加删除元素,引起的问题?
  2. 精准统计ViewController页面加载耗时,从viewdidload->viewdidappear
  3. wkwebview性能优化

贝壳找房 3.5

  1. 项目中的反作弊方案
  2. 组件化技术选型考虑(url调度方案优缺点)、target-action组件方案的优缺点
  3. runtimeisaweakruntime的结构:用weak修饰objkeyvalue分别是啥?
  4. categoryruntime结构里为什么不能增加成员变量:成员变量在编译的时候决定,运行时不能修改
  5. autoreleasepool的底层原理、autoreleasepoolpage的结构

快手 3.7

  1. Load方法调用时机,什么时候被添加到runtimeA类调用B类,A没有被importBAimport,那ABloadinitialize方法是否被调用?
  2. httpshttp的区别?ssl是什么?与tls的区别?
  3. Realm数据库底层实现原理?coredata是数据库吗?对象型数据库与关系型的区别?
  4. 算法:归并排序
  5. 对跨平台开发如flutterReact Native的看法?

十五:大厂常问iOS面试题汇总!

Runloop & KVO

runloop

  1. app如何接收到触摸事件的
  2. 为什么只有主线程的runloop是开启的
  3. 为什么只在主线程刷新UI
  4. PerformSelectorrunloop的关系
  5. 如何使线程保活

KVO

  1. 实现原理
  2. 如何手动关闭kvo
  3. 通过KVC修改属性会触发KVO么
  4. 哪些情况下使用kvo会崩溃,怎么防护崩溃
  5. kvo的优缺点

runtime相关问题

结构模型

  1. 介绍下runtime的内存模型(isa、对象、类、metaclass、结构体的存储信息等)
  2. 为什么要设计metaclass
  3. class_copyIvarList & class_copyPropertyList区别
  4. class_rw_tclass_ro_t 的区别
  5. category如何被加载的,两个category的load方法的加载顺序,两个category的同名方法的加载顺序
  6. category & extension区别,能给NSObject添加Extension吗,结果如何
  7. 消息转发机制,消息转发机制和其他语言的消息机制优劣对比
  8. 在方法调用的时候,方法查询-> 动态解析-> 消息转发 之前做了什么
  9. IMPSELMethod的区别和使用场景
  10. loadinitialize方法的区别什么?在继承关系中他们有什么区别
  11. 说说消息转发机制的优劣

Block

  1. block的内部实现,结构体是什么样的
  2. block是类吗,有哪些类型
  3. 一个int变量被 __block 修饰与否的区别?block的变量截获
  4. block在修改NSMutableArray,需不需要添加__block
  5. 怎么进行内存管理的
  6. block可以用strong修饰吗
  7. 解决循环引用时为什么要用__strong、__weak修饰
  8. block发生copy时机
  9. Block访问对象类型的auto变量时,在ARC和MRC下有什么区别

多线程

主要以GCD为主

  1. iOS开发中有多少类型的线程?分别对比
  2. GCD有哪些队列,默认提供哪些队列
  3. GCD有哪些方法api
  4. GCD主线程 & 主队列的关系
  5. 如何实现同步,有多少方式就说多少
  6. dispatch_once实现原理
  7. 什么情况下会死锁
  8. 有哪些类型的线程锁,分别介绍下作用和使用场景
  9. NSOperationQueue中的maxConcurrentOperationCount默认值
  10. NSTimer、CADisplayLink、dispatch_source_t 的优劣

性能优化

如何做启动优化,如何监控
如何做卡顿优化,如何监控
如何做耗电优化,如何监控
如何做网络优化,如何监控

架构设计

  1. 手动埋点、自动化埋点、可视化埋点
  2. MVC、MVP、MVVM设计模式
  3. 常见的设计模式
  4. 单例的弊端
  5. 常见的路由方案,以及优缺点对比
  6. 如果保证项目的稳定性
  7. 设计一个图片缓存框架(LRU)
  8. 如何设计一个git diff
  9. 设计一个线程池?画出你的架构图
  10. 你的app架构是什么,有什么优缺点、为什么这么做、怎么改进

数据结构与算法

  1. 八大排序算法
  2. 栈&队列
  3. 字符串处理
  4. 链表
  5. 二叉树相关操作
  6. 深搜广搜
  7. 基本的动态规划题、贪心算法、二分查找

总结

这些都是收集于最近面试中一些常见问题,欢迎各位业界高手留下更多的题目与答案!

十六:iOS面试辅助之iOS面试题集

前言

iOS面试辅助不针对任何一家面试题,这只是刷题的时候分享可能会出现的面试题,大家一起查漏补缺,温故知新。希望给你提供上真正帮助。

题目

1、说一下OC的反射机制;

2、block的实质是什么?有几种block?分别是怎样产生的?

3、__block修饰的变量为什么能在block里面能改变其值?

4、说一下线程之间的通信。

5、你们应用的崩溃率是多少?

6、说一下hash算法。

7、NSDictionary的实现原理是什么?

8、你们的App是如何处理本地数据安全的(比如用户名的密码)?

9、遇到过BAD_ACCESS的错误吗?你是怎样调试的?

10、什么是指针常量和常量指针?

11、不借用第三个变量,如何交换两个变量的值?要求手动写出交换过程。

12、若你去设计一个通知中心,你会怎样设计?

13、如何去设计一个方案去应对后端频繁更改的字段接口?

14、KVO、KVC的实现原理

15、用递归算法求1到n的和

16、category为什么不能添加属性?

17、说一下runloop和线程的关系。

18、说一下autoreleasePool的实现原理。

19、说一下简单工厂模式,工厂模式以及抽象工厂模式?

20、如何设计一个网络请求库?

21、说一下多线程,你平常是怎么用的?

22、说一下UITableViewCell的卡顿你是怎么优化的?

23、看过哪些三方库?说一下实现原理以及好在哪里?

24、说一下HTTP协议以及经常使用的code码的含义。

25、设计一套缓存策略。

26、设计一个检测主线和卡顿的方案。

27、说一下runtime,工作是如何使用的?看过runtime源码吗?

28、说几个你在工作中使用到的线程安全的例子。

29、用过哪些锁?哪些锁的性能比较高?

30、说一下HTTP和HTTPs的请求过程?

31、说一下TCP和UDP

32、说一下静态库和动态库之间的区别

33、load和initialize方法分别在什么时候调用的?

34、NSNotificationCenter是在哪个线程发送的通知?

35、用过swift吗?如果没有,平常有学习吗?

36、说一下你对架构的理解?

37、为什么一定要在主线程里面更新UI?

小福利:

iOS面试合集+答案(1-5) (juejin.cn)

一份iOS开发者的学习路线参考 (qq.com)

持续更新!喜欢的小伙伴点赞,关注一下哦!谢谢!