过招多家大厂提炼的iOS面试心经

2018年,整个资本市场风起云涌,大环境下,互联网更是风声鹤唳,大多数公司面临着裁员,结构重构,他们收紧资本,为自己取暖。在漫长的寒冬下,互联网人只有自己修炼内功,才能在寒风中屹立不倒。

作为一名iOS开发者,要时时刻刻保持学习的冲劲,新的知识每年都是海量增长,要学的东西真的太多太多。很多公司收紧资本,所以,对于找人这块,更是慎之又慎,如果不是实力过硬,很难找到一份称心的工作。

所以,学好iOS很重要,大公司对于开发者的要求也越来越偏向于底层。一个有扎实内功的开发者,才会受到公司的青睐。

学好iOS的底层,无怪乎有几大块的知识点需要掌握,也必须掌握:

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()之前的过程有哪些?

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

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

  4. 设计一套缓存策略。

  5. 用过哪些锁?哪些锁的性能比较高?

  6. iOS启动优化和列表优化点

  7. iOS与h5的交互

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

  9. 说一下响应链?

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

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

  12. CoreText实现富文本?

  13. ViewController的生命周期?

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

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

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

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

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

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

iOS网络请求

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

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

  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只是一个代码编写工具,代码的编译运行交给脚本处理,能够用脚本处理许多事情

进阶iOS当然还有许多路要走,不过,千里之行始于足下,吾将上下而求索!!!

本文面试题答案见下文:https://blog.csdn.net/John_5555/article/details/87529298

猜你喜欢

转载自blog.csdn.net/John_5555/article/details/87076186