面试题总结
1、算法问题,链表反转、二分搜索、深度搜索、广度搜索、常见算法 时间复杂度(大 O 表示)
2、OC相关
2.1、Block 在内存中位置、原理、在Block内部可否修改局部变量、如果不能修改为什么,能否修改全局变量,可以修改为什么、还有静态变量,全局静态变量能否修改
2.1、GCD与Nsoperation应用场景,有什么区别,Gcd group、dispatch_barrier_async、dispatch_semaphore用法
2.2、深浅拷贝的区别,对可变对象执行 copy 和 不可变对象 执行 copy有什么区别,strong 为什么不可以用来修饰 可变属性,对一个数组 执行 mutableCopy 后,复制后新数组里面的元素是深拷贝,还是浅拷贝
2.3、对网络层 做过哪些事情,优化、H5 与 native 交互、http 与 Tcp、Udp、Socket区别,常用加密算法有哪些
2.4、有没有阅读过第三方源码、比如 说说 SDWebimage 原理
2.5、对项目做过哪些性能优化、包括优化列表滑动速度、优化 CPU、内存 占用率、线上崩溃统计分析、优化包大小
2.6 、常用设计模式、代理、Block、通知中心、在你项目中的应用场景、分别有什么区别呢
2.7、了解过 MVVM吗 ? 了解过,讲讲项目中应用,没有了解过、你对 降低代码 耦合度,提高代码复用、做过哪些尝试
2.8、常用动画UIview动画,Basic动画的用法
2.9、怎么保证数据的读写安全、互斥锁、dispatch_semaphore了解过吗?
2.10、动态库与静态库的区别
2.11、Cocoapods帮助我们项目做了哪些事情,Podfile文件中有个参数use_frameworks!的作用、Podlock文件的作用
2.12、Runtime 中isa指针指向的什么,MetaClass是什么,实例方法和类方法的methodLists分别存在什么地方,是存在同一个地方吗,Runtime消息转发的流程什么,Methodswizzling是什么
2.13、Runtime应用,如何通过Runtime给系统类添加一个属性、替换一个类的方法实现、给系统类动态添加一个方法
2.14、RunLoop和线程的关系什么、soure0与 soure1区别、AutoreleasePool和runloop的关系、在在Core Foundation中有RunLoop的五个类,分别是什么、作用是什么
2.15、创建的了A、B两个Nsoperation添加到NsoperationQueue,设置B依赖A、同时B的优先级高于A、A与B、哪个先执行
2.16、iOS 点击程序图标,到启动 app 经历了什么
2.17、UIView和CALayer的区别?通过View的layer设置圆角为什么有性能消耗、什么是离屏渲染
3、Swift相关
3.1、为什么说 Swift 是一门函数式语言
3.2、Swift的reduce、map、flatMap、filter用法
3.3、@discardableResult、@escaping用法
3.4、泛型的含义,什么是 高阶函数
4.0在一个方法中的局部变量,需要return给调用者,这个局部变量什么时候会释放
4.1.调用一个对象未实现的方法,中间的过程和结果分别是什么
4.2下面的代码返回的结果result1和result2各是什么,并解释下原因
4.3使用过那些提高效率的调试工具或者技巧
4.4 像一个nil对象发送消息会发生什么
因为OC的函数都是通过objc_msgSend进行消息发送来实现的,相对于C和C++来说,对于空指针的操作会引起crash问题,而objc_msgSend会通过判断self来决定是否发送消息,如果self为nil,那么selector也会为空,直接返回,不会出现问题。视方法返回值,向nil发消息可能会返回nil(返回值为对象),0(返回值为一些基础数据)或0X0(返回值为id)等。但对于[NSNull null]对象发送消息时,是会crash的,因为NSNull类只有一个null方法。
但是有人会说,如果向一个nil对象发消息不会crash的话,那么unrecognized selector sent to instance的错误是怎么回事?
这是因为这个对象已经被释放了(引用计数为0了),那么这个时候再去调用方法肯定是会Crash的,因为这个时候这个对象就是一个野指针(指向僵尸对象(对象的引用计数为0,指针指向的内存已经不可用)的指针)了,安全的做法是释放后将对象重新置为nil,使它成为一个空指针,大家可以在关闭ARC后手动release对象验证一下。
4.5instanceType 和ID 的区别
4.6block内部如何修改外部局部变量,并阐述原因
4.7循环引用的产生原因及其整么正确的防止循环引用
4.8GCD实现一个同步锁
dispatch_queue_t queue = dispatch_queue_create("queue", NULL);
dispatch_sync(queue, ^{
NSLog(@"---");
});
NSLog(@"---===");
使用GCD信号量实现网络请求顺序执行 -
4.9如何使用runtime实现weak属性
如何使用 Runtime 给现有的类添加 weak 属性 -
iOS MRC、ARC 与 @autoreleasepool 学习笔记
链接:iOS MRC、ARC 与 @autoreleasepool 学习笔记 -
iOSInterviewQuestions/《招聘一个靠谱的iOS》面试题参考答案(上).md at master · ChenYilong/iOSInterviewQuestions · GitHub
GitHub - ChenYilong/iOSInterviewQuestions: iOS面试题集锦(附答案)--学习交流群515295083