iOS面试题面试iOS面试总结

过招多家大厂提炼的iOS面试心经(答案版)

2019-02-16  本文已影响399人  水达

承接上文,在2018年底,面试了许多家大公司,如某大型视频公司、电商平台、音频公司、教育公司等,具体名字就不一一列举了。面试这些公司最大的感受就是,这些公司对基础要求特别高,基础扎实的能过一轮二轮,三轮四轮有时候真的看领导对你的眼缘,很多时候靠运气的!所以,有了扎实的基础就是成功的关键。

承接上篇文章,分析一下各问题的答案,属于个人理解,有问题欢迎指正。

OC基础

1. OC对象,底层的结构是怎样的,类与类别,category为什么不能添加属性? 底层的实现原理,如果类别重写了类中的方法,调用顺序是怎样的?OC语言的动态特性,静态编译与动态类型识别,此处阿里曾考过?这些平时不注意的点有没有注意过?

2. OC的属性,assign,copy,strong,retain,weak.这些属性的应用场景,以及经常考的是可变字符串为什么不能用copy修饰?不可变字符串为什么不能用strong修饰,修饰了会怎样?代理如果用assign会怎样?

3. OC的内存管理机制,从MRC到ARC内存管理做了什么?autoreleasePool 什么情况下会用,autoreleasePool 的实现原理?引用计数保存在哪里?了解其数据结构吗?

4. 各种原理性问题,如dictionary的实现原理,KVC的实现原理以及为什么要派生出子类,KVO的实现原理,KVO为什么要移除观察者,timer会造成循环引用吗?怎么解决?weak的实现原理?

5. block的实现原理,__block的作用以及底层实现原理,block的循环引用问题,下划线修饰的变量会造成循环引用吗?怎么处理?masonry链式编程怎么实现的?什么情况下不用__weak?(Masonry、AFNetWorking、动画等)

6. 平时有用到runtime吗?runtime干嘛的,方法交换。runloop的理解。

7. 消息发送机制,消息转发的三步补救措施?objc向一个对象发送消息时,发送消息的整个过程?objc中向一个nil对象发送消息将会发生什么?这个题目很重要,一题可能会否定一个人。

8. 一个对象的本质,一个对象的内存布局,类对象与元类对象?

9. 深拷贝浅拷贝

iOS系统

1. main()之前的过程有哪些?
1)dyld开始将程序二进制文件初始化
2)交由ImageLoader读取Image,其中包含了我们的类、方法等各种符号(Class、Protocol、Selector、IMP)
3)由于runtime向dyld绑定了回调,当Image加载到内存后,dyld会通知runtime进行处理
4)runtime接手后调用map_images做解析和处理
5)接下来load_Images中调用call_load_methods,遍历所有加载进来的Class,按继承层次依次调用Class的+load和其他Category的+load方法
6)至此,所有的信息都被加载进了内存中
7)最后dyld调用真正的main函数
注意:dyld会缓存上一次把信息加载到内存的缓存,所以,第二次比第一次启动快一点。
dyld: 而动态库在加载的时候都需要用dyld(位于/usr/lib/dyld)程序进行链接

2. AF实现原理?SD实现原理?

3. 说一下UITableViewCell的卡顿你是怎么优化的?

4. 设计一套缓存策略。
1. 可以将数据缓存到本地磁盘。
2. 可以判断一个资源是否已经被缓存。如果已经被缓存,在请求相同的资源,先到本地磁盘搜索。
3. 可以判断文件缓存什么时候过期。这里为了简单起见这里,我们在请求url资源的时候,给每次请求的文件设定一个过期的时间。
4. 如果文件已经被缓存,而且没有过期,这将本地的数据返回,否则重新请求url
5. 如果文件下载不成功或者下载没有完成,下次打开程序的时候,移除这些没有成功或者没有下载完成的文件。
6. 开辟线程,同时请求或者下载多个资源。

5.有哪些锁?有什么用处?

6. iOS启动优化和列表优化点
• APP的启动由dyld主导,将可执行文件加载到内存,顺便加载所有依赖的动态库
• 并由runtime负责加载成objc定义的结构
• 所有初始化工作结束后,dyld就会调用main函数
• 接下来就是UIApplicationMain函数,AppDelegate的application:didFinishLaunchingWithOptions:方法

  1. dyld
    • 减少动态库、合并一些动态库(定期清理不必要的动态库)
    • 减少Objc类、分类的数量、减少Selector数量(定期清理不必要的类、分类)
    • 减少C++虚函数数量
    • Swift尽量使用struct
  2. runtime
    • 用+initialize方法和dispatch_once取代所有的attribute((constructor))、C++静态构造器、ObjC的+load。
  3. main
    • 在不影响用户体验的前提下,尽可能将一些操作延迟,不要全部都放在finishLaunching方法中
    • 按需加载

7. iOS与h5的交互

8. 如何增加一条常驻线程?

9. 说一下响应链?

  1. 当iOS程序中发生触摸事件后,系统会将事件加入到UIApplication管理的一个任务队列中
  2. UIApplication将处于任务队列最前端的事件向下分发。即UIWindow。
  3. UIWindow将事件向下分发,即UIView。
  4. UIView首先看自己是否能处理事件,触摸点是否在自己身上。如果能,那么继续寻找子视图。
  5. 遍历子控件,重复以上两步。
  6. 如果没有找到,那么自己就是事件处理者。如果
  7. 如果自己不能处理,那么不做任何处理。
    其中 UIView不接受事件处理的情况主要有以下三种
    1)alpha <0.01
    2)userInteractionEnabled = NO
    3.hidden = YES.
    这个从父控件到子控件寻找处理事件最合适的view的过程,如果父视图不接受事件处理(上面三种情况),则子视图也不能接收事件。事件只要触摸了就会产生,关键在于是否有最合适的view来处理和接收事件,如果遍历到最后都没有最合适的view来接收事件,则该事件被废弃。

10. 动画分为哪几类?如何终结一个动画?什么是转场动画?什么情况下动画会失败?

11. 有没有用过GCD?GCD的group会线程阻塞?下载一张图片,下载过程中UIImageView突然取消会怎样?NsOperation与GCD的不用应用场景

12. CoreText实现富文本?
• CTLine 可以看做Core Text绘制中的一行的对象 通过它可以获得当前行的line ascent,line descent ,line leading,还可以获得Line下的所有Glyph Runs
• CTRun 或者叫做 Glyph Run,是一组共享想相同attributes(属性)的字形的集合体
一个CTFrame有几个CTLine组成,有几行文字就有几行CTLine。一个CTLine有包含多个CTRun,一个CTRun是所有属性都相同的那部分富文本的绘制单元。所以CTRun是CTFrame的基本绘制单元。

13. ViewController的生命周期?

14. 设计一个检测主线和卡顿的方案。

15. iOS应用安全,如何防止反编译?iOS平时的加密措施,密码一般保存在哪里?

16. 感觉项目中哪些地方做的比较好的?有哪些优化点值得推荐的?

17. 项目的整体架构是怎样的,项目层级如何划分?有什么熟悉的架构?项目架构如何做到细分?

18. 平时如何采集性能数据的?

19. 网络请求有没有做到深度优化?

iOS网络请求

1. http与HTTPS,每次请求都要建立证书吗?

2. get与post区别,post请求能否用拼接参数的形式?get一定要拼接参数吗?两个最本质的区别?

  1. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

3. APNS整个请求过程

4. TCP与UDP的应用区别

5. socket的应用场景

6. 本地大量频繁的数据怎么处理?

数据库

1. 平时用的数据库有哪几种?如何联表查询,数据如何保证读取安全?

数据结构与算法

算法建议系统的看,有本书值得推荐《剑指offer》,可以系统的学习。毕竟数据结构与算法是基础,打好基础才能万丈大楼平地起!

1. 二分查找法

2. 反转链表

3. 两组有序数据,查找第k个数

当然,经典算法还有很多,此处就不一一列举了。

脚本

固有的iOS知识有时候并不能满足开发需求了,有时候需要脚本的编写。推荐Python,因为Mac本身就支持Python。能够利用Python处理一些事情,越来越成为一个程序员的基本要求。

1.自动化打包也越来越倾向于用脚本实现

2. 能够用脚本加载一些资源文件

3. 在程序加载之前能够用脚本处理一些事情

4. 许多第三方包依赖于脚本

5. 许多大公司,XCode只是一个代码编写工具,代码的编译运行交给脚本处理,能够用脚本处理许多事情

总结

本文总结了大部分问题的答案,很多都是日积月累总结的。如有不对的地方,欢迎大家指正。

大家在准备面试的时候,可以在本文基础上,形成思维导图,每个知识点连成一片,从而进行系统地学习。

上一篇下一篇

猜你喜欢

热点阅读