Skip to content

Latest commit

 

History

History
341 lines (176 loc) · 15.1 KB

2020-2021年最新面试题收集.md

File metadata and controls

341 lines (176 loc) · 15.1 KB

2020-2021面试题集合

目前收集了 117道 从2020年到2021年 大厂到小厂的面试题 感兴趣的靓仔靓女可以玩玩,感受一下

如果想一起整理答案的靓仔靓女 可以直接微信联系我

Cooci微信

新增面试题

  • 1、 一个私有库有30个类,app1想要用里面的5个,app2想要用里面的10个,怎么做

  • 2、 如果让你去设计一个代理,实现一对多通知模式,这个应该怎么写呢

面试题 1

  • 1、 工作中遇到了什么难点,简历不会写

  • 2、 基础算法的东西,时间冗度相关的

  • 3、 一个算法时间冗余度是多少?

  • 4、 内存泄漏的几种方法

  • 5、 autoreleasePool认识

  • 6、 多个 pods私有库,是如何解决pod install耗时问题

  • 7、 写题,一个满二叉树左节点要指向右节点写一个算法实现

  • 8、 OCswift的区别

  • 9、 如何给关联对象设置成弱引用

  • 10、 weak unowned的区别

  • 11、 stractclass区别

  • 12、 http htpps的区别get post的区别

  • 13、 a b c三个方法通过两次交换最后实现什么样的效果

面试题 2

  • 1、 你了解过哪些三方库的实现

  • 2、 组件化怎么解决依赖

  • 3、 KVO的原理

KVO 是基于 runtime 机制实现的,当某个类的属性对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的 setter 方法。派生类在被重写的setter方法内实现真正的通知机制,如果原类为Person,那么生成的派生类名为NSKVONotifying_Person

每个类对象中都有一个isa指针指向当前类,当一个类对象的第一次被观察,那么系统会偷偷将isa指针指向动态生成的派生类,从而在给被监控属性赋值时执行的是派生类的setter方法(KVO的这套实现机制中苹果还偷偷重写了class方法,让我们误认为还是使用的当前类,从而达到隐藏生成的派生类)。

键值观察通知依赖于 NSObject 的两个方法: willChangeValueForKey:didChangevlueForKey:;在一个被观察属性发生改变之前, willChangeValueForKey: 一定会被调用,这就会记录旧的值。而当改变发生后,didChangeValueForKey: 会被调用。

继而observeValueForKey:ofObject:change:context:也会被调用。


  • 4、 kvc的原理

  • 5、 可变数组线程安全吗

  • 6、 block一定会造成强引用吗

  • 7、 delloc的强用顺序

  • 8、 SDWeblmage的底层实现

  • 9、 启动是做了什么操作

  • 10、 什么时候用mvc,mvp,mvvm

  • 11、 从页面A跳转到页面B内存里面会发生什么

  • 12、 怎么去实现全局app的点击事件埋点

  • 13、 启动阶段需要加载很多动态该怎么去优化耗时

  • 14、 为什么要从上家公司离职呢?有组件化开发的经验吗

  • 15、 简历投了没反应 希望逻辑出一份简历的模板给大家参考 增加投递成功率

  • 16、 经常问项目难点 项目亮点 项目框架不知道怎么回答

  • 17、 iOS 主线程具体在什么时候创建的?

  • 18、 第三方库的实现分析 实现亮点

  • 19、 在哪方面有比较深的研究,技术亮点是什么

  • 20、 可变数组的原理

  • 21、 你觉得iOS有前途吗

面试题 3 - 涂鸦智能面试题

  • 1、 为什么Category 不能添加属性,为什么还要设计ro,直接添加不是很方便么,如果将flag改变ro能不能写入,改变了会怎样

因为属性会生成对应的ivar,编译后的内存结构已经确定了,Category的数据是在运行时才附加到类,rw 又里面没有ivar_listro是为了存储编译后的类的内存结构,直接加会改变内存结构。 改了理论上可以写入,相当于动态创建的类先添加ivar 在注册类是允许的,但是 flag 在很多地方都有判断,直接修改会有崩溃的可能。

在一个分类中添加了一个属性,Xcode 不会自动的为其生成一个下划线开头的成员变量及 set和get方法,如果你没有手动的实现这两个方法,直接在外面通过点语法调用这个属性,肯定就直接挂了,Unrecognised selector send to instance,因为他压根就没有这两个方法,所以当你真的在分类中声明了一个属性的时候,就要手动的去实现这个属性的set和get方法,这个时候就要用到运行时机制了,关联上去这个属性的存取过程。


  • 2、 KVO`原理,是怎么找到中间类的(isa->中间类)

KVO 是基于 runtime 机制实现的,当某个类的属性对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的 setter 方法。派生类在被重写的setter方法内实现真正的通知机制,如果原类为Person,那么生成的派生类名为NSKVONotifying_Person

每个类对象中都有一个isa指针指向当前类,当一个类对象的第一次被观察,那么系统会偷偷将isa指针指向动态生成的派生类,从而在给被监控属性赋值时执行的是派生类的setter方法(KVO的这套实现机制中苹果还偷偷重写了class方法,让我们误认为还是使用的当前类,从而达到隐藏生成的派生类)。

键值观察通知依赖于 NSObject 的两个方法: willChangeValueForKey:didChangevlueForKey:;在一个被观察属性发生改变之前, willChangeValueForKey: 一定会被调用,这就会记录旧的值。而当改变发生后,didChangeValueForKey: 会被调用。

继而observeValueForKey:ofObject:change:context:也会被调用。

  • 3、 Category 和主类方法谁先调用

  • 4、 methodswizzling,用它干了什么,埋了什么点,如果给按钮点击埋点怎么实现,为什么交换方法要自己调用自己不会递归么

  • 5、 组件化,依赖下沉,组件通讯CTM,Router,怎么管理组件

  • 6、 多线程,如果有1,2,3,4四个任务,要1,2执行完以后执行3,4,用什么实现?

  • 7、 应用优化,premain ,main ,弱网优化,界面优化,内存优化,怎么检测内存泄漏

  • 8、 pod install ,pod update区别,pod lock是干嘛的

  • 9、 dispatch_main sync() 会发生什么  线程怎么保活

  • 10、 autoreleasepull 怎么加进去的,什么时候push,什么时候pop,什么时候会用


  • 11、 weak 原理,一个对象如果有多个weak指针指向(entry数组),怎么销毁

系统维护了一个全局的 map表。这个表里有多个 sideTablesideTable里面有 weak_table(弱引用表)

当通过 __weak 让一个指针指向一个对象的时候,如果这个对象之前没有被注册,就会调用 objc_initWeak() 方法 如果是已经注册的,会调用 objc_storeWeak()。对象销毁的时候,会调用 objc_destroyWeak() 当然,objc_initWeak()objc_destroyWeak() 最终都会调用objc_storeWeak()

objc_storeWeak()这个方法里,先根据对象的地址,从全局 map表 中找到对应的 sideTable,然后再从sideTable中找到对应的 weak_table,找到弱引用表后,生成或者更新weak_entry_tweak_entry_t里面存了对象的地址和指向对象的所有弱引用指针。

销毁

    1. 调用objc_release
    1. 因为对象的引用计数为0,所以执行dealloc
    1. dealloc中,调用了_objc_rootDealloc函数
    1. _objc_rootDealloc中,调用了 object_dispose 函数
    1. 调用 objc_destructInstance
    1. 最后调用 objc_clear_deallocating

objc_clear_deallocating内部

    1. weak表中获取废弃对象的地址为键值的记录
    1. 将包含在记录中的所有附有 weak修饰符变量的地址,赋值为nil
    1. weak表中该记录删除
    1. 从引用计数表中删除废弃对象的地址为键值的记录

  • 12、 循环引用,为什么要在block中加strong,不加会怎样
  • 13、 SEL怎么找到imp的,消息发送流程

  • 14、  消息转发流程,引出错误捕捉|

  • 15、  错误分析,dSYM是干嘛的,如何分析的,怎么防止崩溃,在转发哪一步做

  • 16、 js交互,有没有用过,原理是什么

  • 17、 网络,https,验证流程,ssl加密、证书是干嘛的包含哪些信息,tcp udp,为什么说tcp是可靠的,postman也能发起https请求什么原理、中间人攻击|

面试题 4

  • 1、 手写链表翻转

  • 2、 fastlane 的理解以及原理

  • 3、 你对编解码,音频混合的理解

  • 4、 H5交互 数据库 算法 网络

  • 5、 内存oom之后,怎么获取引起 oom 的堆栈?

  • 6、 runtime [原理+你项目怎么用]:

  • 7、 runloop[原理+你项目怎么用]:

  • 8、 线程[原理+你项目怎么用]:

  • 9、 httpshttp 的区别

  • 10、 界面优化的策略和实际开发

  • 11、 谈谈你对离屏渲染的理解和原理

  • 12、 swift里的 defer 逃逸闭包:

  • 13、 swift 初始化方法:

  • 14、 swift open  public 等关键字区别

  • 15、 swiftoc对比:

  • 16、 swift的派发机制:

  • 17、 OC的消息转发机制:

面试题 5

  • 1、 TCP  UDP区别

  • 2、 socket 的使用和注意事项

  • 3、 组建化[流程怎么用,优缺点等]:

  • 4、 问你项目用到的技术,优化

  • 5、 代理与 block 得区别?weakassign 得区别?代理使用assign会出现问题吗?

  • 6、 使用copy修饰 NSMutableary会出现什么问题?

  • 7、 数组遍历得方式?哪种方式性能最好

  • 8、 runtime底层实现。使用场景?方法交换得底层?属性关联底层是如何实现得?数组越界?btn点击域

  • 9、 sqlite 扩展数据库字段

面试题 6

  • 1、 分类得作用?底层是怎样得?

  • 2、 对象得内存布局是怎样得?

  • 3、 isa 里边存储 得是什么?

  • 4、 看过哪些第三方库得源码?AFnetworking、SDWebimage?

  • 5、 KVO的底层是?调用class方法输出的是什么?

  • 6、 kvc底层原理是怎样?

  • 7、 数据储存的方式?使用过哪些?sqlite扩展字段 怎么实现?

  • 8、 runloop了解吗?底层是怎样的?

  • 9、 htmljs交互做过吗?知道 webview 怎么和 HTML 相互传输数据吗?

  • 10、 常见的使用的GCD函数?队列组底层?信号量底层?栅栏底层?

  • 11、 你使用过 dispatch_once 吗?了解底层吗?让你实现一个应该怎么操作?

dispatch_once 源码实现,底层是通过 dispatch_once_f 实现的

  • dispatch_once_t 作为标识下面 dispatch_onceblock 是否已执行过。

  • static 修饰会默认将其初始化为0,当值为0时才会执行block

  • 当block执行完成,底层会将onceToken设置为1,这也就是为什么要传onceToken的地址(static 修饰的变量可以通过地址修改onceToken的值),同时底层会加锁来保证这个方法是线程安全的"


  • 12、 如何让五个任务先执行完之后,再执行后续任务?实现方式有哪几种?

面试题 7

  • 1、 talbleview 的性能优化你做过哪些?

  • 2、 项目中你做过哪些方面的性能优化?

  • 3、 内存oom之后,怎么获取引起oom的堆栈?

  • 4、 何监控线上版本 APP启动耗时(包含动态库的加载时间)?

  • 5、 如何监控线上版本 APP启动 时,每个 +load方法C++静态变量初始化方法的耗时?

  • 6、 在实际工作中,说说关于crash 或者内存问题的修复例子

  • 7、 NSTimer 在项目中有没有用到?在使用的时候有什么地方需要注意的吗?如果使用不当会引起什么问题?

  • 8、 NSTimer 在项目中有没有用到?在使用的时候有什么地方需要注意的吗?如果使用不当会引起什么问题?

  • 9、 我们创建一个子线程,并且希望这个子线程能长期存活有哪些方案?

  • 10、 我们引入 NSRunloop 的目的是?

  • 11、 项目中有用到多线程吗?处理耗时任务的子线程任务结束后你们是怎么处理的?

  • 12、 有ABC三个任务并发执行,等结束后我希望执行第四个任务,这种场景该怎么实现?

面试题 8

  • 1、 事件响应链的过程

  • 2、 你了解到的排序算法和对应的时间复杂度。

  • 3、 TCP和UDP的区别,他们应运的业务场景是?说一下TCP的三次握手?

  • 4、 HTTPSHTTP的区别是?HTTPS用的加密方式是哪一种?详细描述一下HTTPS加密的两个阶段(非对称加密和对称加密)

  • 5、 分享一下你做的项目中技术含量高的点。

  • 6、 为什么动态库多了会影响 App的启动速度?动态库和静态库的区别是?

由于动态库并不会直接打包到我们二进制文件中,dyld加载动态股前需要遍历所有的 DYLD_INSERT_LIBRARIES 对象,调用loadInsertedDylib 加载,插入后会链接主程序,和链接动态库期间还要完成,最后还要完成若符号的绑定,这样的操作过程是非常耗时的

程序启动前需要把控制器交给dyld,dyld的工作包括链接动态库,动态库多了就会延长dyld的执行时间,也就影响了启动速度。 静态库是编译时链接然后合并到主程序,动态库是运行时链接的,不合并主程序, 静态库每次编译都会生成一份,而动态库如果是系统的只有一份在共享缓存中,自己动态库和静态库一样生成多份,除非是在扩展中使用的动态库

  • 区别:动态库是运行时加载,静态库是编译是加载。

  • 动态库在APPmach-o中是单独一块儿,静态库在mach-o中会和其他代码一样分布。

  • 静态库在链接时完整地拷贝至可执行文件中, 被多个依赖多次使用就会有多份冗余拷贝.

  • 动态库:在链接时不复制, 程序运行时由系统动态加载到内存, 供程序调用, 系统只加载一次, 多个程序共用, 节省内存(系统动态库)


  • 7、 静态库里有个类或者方法,在编译成App之后,它会存在什么位置?是存在、a文件里还是会存在主App的可执行文件里?如果是动态库呢?

  • 8、 TableView在快速滑动的时候App有可能会掉帧,分析一下是什么原因造成的?怎么优化?

  • 9、 UITableViewCell上加上特别大的照片在滑动的时候会掉帧,这个怎么优化?

  • 10、 SDWebImage图片缓存策略是?自己写一套代码实现这套逻辑。

  • 11、 写一下链表翻转

  • 12、 字符串相乘(两个字符串如“123”“321”相乘)算法

  • 13、 数组和链表的区别

  • 14、 栈的特点、

  • 15、 红黑树的理解和优缺点 

  • 16、 怎么保证自己的类一定能调用到自己写的方法?(不知道有没有人会写一个分类,里面有和自己的类方法名字一模一样)(美团)

这八套题掌握了,我相信高薪iOS 你也就不远了! 加油.... 喜欢留个👍再走吧