ios面试题整理
先把阿里口碑的电话面试说下吧,问了我最近做过的需求,我回答说改版了登录注册模块,于是问我从登录到后台验证的整个过程以及如何加密? 看我简历写了封装图片下载缓存,于是问了我图片缓存策略、归档以什么作为key、什么作为文件名? 到后面问到我NSArray和NSDictionary的作用和区别? https://blog.csdn.net/Deft_MKJing/article/details/82732833?utm_source=app
其他的几家作一个汇总吧
1.你对MVC的理解
2.GCD如何实现多个并发全部完成后再进行通知?dispatch_group方法会创建新线程吗?
3.LLVM和Clang是什么
4.热部署是什么
5.byte和bit的区别
6.ios main函数执行了些什么操作 http://blog.sunnyxx.com/2014/08/30/objc-pre-main/
7.类别为什么添加不了属性 附上不错的回答:https://www.zhihu.com/question/51513146
8.category重写的方法为什么会先执行 https://www.jianshu.com/p/4cd699a66f9b
根据runtime的消息传递机制中的核心函数void objc_msgSend(id self,SEL cmd,...)来发送消息,先从当前类中查找调用的方法,若没有找到则继续从其父类中一层层往上找,那么对于category重写同一个方法,则在消息传递的过程中,会最先找到category中的方法并执行该方法。对于多个分类调用同一个方法,Xcode在运行时是根据buildPhases->Compile Sources里面的从上至下顺序编译的,编译时通过压栈的方式将多个分类压栈,根据后进先出的原则,后编译的会被先调用,当objc_msgSend找到方法并调用之后,就不再继续传递消息,所以形成所谓上的覆盖。并不是后面创建的就一定被调用,得看创建之后其在buildPhases->Compile Sources里面的位置。
9.tableView有哪些delegate和dataSource方法,哪个方法先执行
10.轮播图的几种实现方式
11.appDelegate的几种代理方法
12.https ssl 原理 https://cloud.tencent.com/developer/article/1601995
13.如果让你自己封装网络请求库,你会用NSURLConnection还是NSURLSession,异步方法如何实现
14.Method Swizzing是如何实现的 (修改method中SEL和IMP的对应关系(IMP函数指针指向))
待续~~~~~
2.5号 晚上接到携程的电话面试
1.用户点击屏幕的响应过程 http://www.cocoachina.com/articles/14896
2.category 和 extension的区别 https://www.jianshu.com/p/a5e517a3064b
3.通知是同步的还是异步的
4.https 客户端和服务端交互过程 (域名解析,建立连接, 客户端发送请求,服务端响应请求)
5.DNS如何解析域名的
6.get请求和post请求的区别 https://www.cnblogs.com/logsharing/p/8448446.html
7.ARC造成内存泄漏的几种情况(NSTimer、delegate、block、非OC类的方法)
7.load方法在main函数之前还是之后执行 (前)
待续~~~
---- 2019.6.13 准备面试了 -------
消息转发 https://www.jianshu.com/p/f9bd98ad5b05
dispatch_group_enter、dispatch_group_leave配合使用,如果不使用的话 ,异步里异步并发会出现问题 https://www.jianshu.com/p/d840fb75e668
NSDictionary和NSArray的底层原理 https://blog.csdn.net/Deft_MKJing/article/details/82732833
isEqual和hash https://blog.csdn.net/hx_lei/article/details/53885798
JavaScript异步机制 https://www.cnblogs.com/zhaodongyu/p/3922961.html
---7.29-----
1.KVC的底层原理 https://blog.csdn.net/qq_18505715/article/details/80205796
KVO的原理 https://www.jianshu.com/p/a8195d182742
2.React框架如何让iOS原生和JS交互
3.项目中react-native整体架构
4.runtime的理解, 项目中运用到runtime的地方
5.props和state的区别
6.react-native如何渲染组件的(虚拟DOM....)
7.ES6(react)中import导入时,有的带花括号{},有的不带(export default导出不带,默认导出只能有一个,其他的export需要{} https://blog.csdn.net/Chris__wang/article/details/82977626)
https://blog.csdn.net/Deft_MKJing/article/details/82732833?utm_source=app
-----8.19 携程 根据简历面的-----
1.MVC https://www.cnblogs.com/QianChia/p/5771082.html、MVP http://www.cocoachina.com/articles/21062
2.iOS实现多继承的方式(protocol, category, 消息转发)
4.strong和copy的区别
5.如果在一个方法里声明block,block里引用了self会造成循环引用吗?(不会,需要声明成@property和当前类互相强引用 https://www.jianshu.com/p/fc2f4d207d25),调用系统的block方法并且引用self也不会造成循环引用,比如[UIView animateWithDuration...]
6.dispatch_group 如果有两个dispatch_enter,三个dispatch_leave会出现什么情况(enter和leave不对等) 答:crash https://www.jianshu.com/p/d7b6dfdb7181
7.delegate和notification的区别
8.tableView优化 (如果一个cell有几张图片的话,runloop每次循环只加载一张图片 https://www.jianshu.com/p/30f7ced70083)
-----8.29 京东 -----
1.runloop、autorelease原理 https://www.jianshu.com/p/d260d18dd551
2.RN的通信原理
3.组件化的理解
4.block的理解 https://www.jianshu.com/p/221d0778dcaa
-----------自己准备的一些题-----------------
1.load和initialize的区别 : (1) load在main函数之前,initialize在main函数之后 (2)load只要装载进内存就会调用, initialize当第一次使用这个类或者其子类就会调用(3)如果父类或者子类的category实现了initialize方法,那么父类或者子类不会调用自身的initialize,只会调用对应category的initialize方法,父类和子类有多个category也只会实现compile sources最底部的 (4)load方法先实现父类的,然后子类的,最后才是父类和子类的category的,category的load调用顺序按照compile sources从上而下
2.runtime json->model : 遍历json的key,class_getProperty(待转的对象,key)获取property, 比如有个@property(nonatomic, strong)NSString *name; property_getAttributes(property)获取property的特征字符串,可以拿到property的类型比如NSString, 通过key获取json对应的value, 判断value的类型是不是和上面通过property_getAttributes拿到的类型相同,类型相同则赋值。
如果value的类型是string, property的类型是nsDate,可以转换成nsDate再赋值,如果value的类型是NSDictionary(字典套字典)则将这个value递归调用该方法(这时候的待转对象则应该是第一个待转对象其中的属性 比如@property(nonatomiic, strong)Price *price; 这个Price对象)
如果value的类型是NSSArray,@property的类型也是NSArray(对象里有个数组,数组里再套对象),则先定义好property对应的NSArray的model类型,再遍历value的array进行相应赋值
3.堆排序: 时间复杂度 n*log2n 不停地建立大顶堆/小顶堆,建立完一次就替换首位位置然后去除尾部(尾部此时是最大或者最小)剩下的部分继续建堆。
为什么要逆序遍历?答:首先堆排序针对的是一个丝毫不满足最大堆特点的一个数组(0号位置不放元素),首先要从后向前调整每一个非叶子结点开始(也就是倒数第二层),这个是用来建立堆的(就是让误规律的变成有一定规律的),若你从前向后就会忽略另一条大分支树,一条道走到黑了,不能正确建立堆;后面可以从前往后调整的原因是只有最顶上的那个被换了,其他分支都是满足最大堆的
4.method_swizziling 可以hook viewWillAppear等生命周期方法埋点,比如统计用户行为分析(用户先浏览了首页然后详情页然后支付页...)
---------8.30京东------------
1.虚拟DOM是什么
2.自动释放池和runloop的关系?自动释放池的数据结构
3.ARC有栈block吗 https://www.jianshu.com/p/19e6de8437f5(block讲得不错)
4.两个栈模拟出一个队列
5.事件拦截和消息转发 https://www.jianshu.com/p/db3518be5ebb
--------2020/5/19毒-------
1.kvo是什么模式 观察者
2.自己如何实现通知(观察者模式)不移除通知会有什么影响 https://www.jianshu.com/p/4a44b9a15fe9
3.runloop如何唤醒 (source 和 timer)
4.atomic属性怎么实现(锁的机制)
5.swift如何实现代理协议枚举,值类型引用类型, optional内部实现
6.kvo生成的新子类实现了哪些方法,有没有get方法 https://www.jianshu.com/p/5477cf91bb32
-----2020/5/20 阅文集团--------
1.为什么ios不用try catch (无法释放)
2.LRU算法(哈希链表)
dispatch_barrier_async 和 dispatch_barrier_sync的区别 https://www.jianshu.com/p/9ed95082f256
swift copy-on-write(写时技术) https://blog.csdn.net/weixin_34417814/article/details/91366280
ios signal崩溃如何分析 (SIGABRT–程序中止命令中止信号,SIGALRM–程序超时信号,SIGFPE–程序浮点异常信号等。。。可以获取类型然后传到service, EXC_BAD_ACCESS一般是内存访问出错,对象内存已经释放,但仍然在访问会造成这样的后果, 可以通过打开僵尸模式查找)
Person继承NSObject, NSObject有个分类里的A方法,Person能去调用吗 (可以)
UIViewCtroller有tableview, cell有点击方法,如果UIViewController的UIView设置tapGesture,这时候会响应cell还是uiview(响应uiview, 手势与响应者链有一些差别,触摸事件首先会传递到手势上,如果手势识别成功,就会取消事件的继续传递。如果手势识别失败,事件才会被响应链处理。https://www.jianshu.com/p/ea6bb96c0470)
-----2020/5/25 掌门1对1------
ARC 引用计数 当计数为0的时候对象会自动调用dealloc https://www.jianshu.com/p/e7b1651df746
copy修饰的NSMutableArray可以添加对象吗(不可以,会崩溃,copy修饰的后变成不可变数组,不能调用add方法 https://www.jianshu.com/p/869ca6fbdd5c)
self class 和 super class的打印结果(相同 http://www.cocoachina.com/articles/10740)
常见的内存泄漏(循环引用,nstimer,CoreFoundation对象(C对象) )
weak对象什么时候释放 https://www.cnblogs.com/guohai-stronger/p/10161870.html
有哪些锁 https://www.jianshu.com/p/6d6832e42936
网络协议
http有状态无状态(无状态,通过cookie session https://www.cnblogs.com/bq-med/p/8603664.html)
----2020/5/26 百度一面------
1. iOS的各种锁以及性能 (互斥和自旋,互斥中递归和非递归的性能比较)
2.iOS性能优化 优化启动时间 https://zhuanlan.zhihu.com/p/28600469
3. 二叉树的深度和最大宽度
4.md5 不可逆 加密后长度固定128位
5.为什么符号化可以看到具体崩溃的方法 崩溃日志对应的 dSYM 文件(dSYM 是保存十六进制函数地址映射信息的中转文件,符号化过程中的十六进制函数地址对应的方法名函数名就保存在这个文件中)。https://www.jianshu.com/p/c60d9578b656
------ --------
1.websocket 相关
TCP与UDP区别 (面向连接和无连接 ,都是传输层协议....)
http的报文结构 (请求行请求头请求体 响应行响应头响应体) https://www.cnblogs.com/myseries/p/11239662.html
离屏渲染 https://www.jianshu.com/p/cff0d1b3c915
cocoapods use_frameworks https://www.jianshu.com/p/f938b1e17974
---- blibli------
1.NSProxy实现hook(切面编程) https://www.jianshu.com/p/a7187e014c03
2.自己封装的图片缓存优化点(结合LRU算法)
-----Swift 相关 -------
1.struct 和 class区别
2.逃逸闭包和非逃逸闭包
3.高阶函数(map, flatmap, reduce.... flatmap和map的区别)
4.optional
5.结构体里如何修改属性
iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别 https://www.jianshu.com/p/5df570135ad2