面经(一) zhuanlan.zhihu.com/p/54932968 OC全解文字版
- Q:OC用得多还是Swift用得多 A:OC用得多,swift也有用
- 相当于项目里是有混编的内容在?A:是的
- 参与的项目就是xx软件主端的app开发?A:是,除直播间外的(//原来说的啰里八嗦,可直接参考面试官的说法) Q:就是语音房外的开发?
这部分了解基本信息
-
项目里为什么要做组件化 A:因为原先代码很多,一些内部原因,代码繁杂,吧啦吧啦扯一堆,然后扯到自己简历上写的组件化//猜测面试官想问的是组件化的意义,再延伸一些其他问题
// 极客
回答该问题,为什么要做//不是去了解公司为啥做,而是考察你会不会这个点:
- xx项目规模较大,基础功能稳定,适合用组件化
- 各组件单独编译,开发过程可以缩减整个项目的编译时间成本(因为有些组件初次编译.O文件已在,开发过程没修改,Xcode可以直接拿来用)、组件间解耦,明确依赖关系,减少协同开发的互相依赖和冲突提高团队协作开发效率、基础模块的组件可以在不同项目中复用
-
项目里怎么通过组件化的方式来解耦,怎么通信 A:用的是protocol // 更正:protocol-class方案
-
用的是protocol,那怎么去注册,怎么去调用 A:自注册
-
那在什么时机去注册? A:(不懂)问了在什么时机是指什么呢?
-
因为你说的是自注册,那你这个组件是在什么时候去注册进去?A:在中转的组件建protocol,A B组件要互相调用要通过中间组件,先在中间组件做protocol,在B组件要调用A组件的方法的时候,会调用自注册的方法,自注册的方法是个宏方法来的 Q:那怎么去找到A组件呢
// 分析:面试官想问的就是怎么注册,怎么调用;通信就是注册,调用的事,就是问这个方案最基本的原理;自己回答了一通,把之前项目已经抽了一层的结果揉杂进来回答,导致思路十分混乱,面试官根本提取不到有用的信息,一直在引导回怎么注册调用,而自己没复习这部分,越回答越偏了;
-
protocol怎么去注册,怎么去调用 - A:不了解了 // 其实自己早已分析过这部分,一是记不清了,二是之前自己的回答给自己带偏了;
-
那你还了解其他的组件化方案吗
-
极客组件化部分及总结
-
看简历写重构子部tab
-
子部tab是用什么实现的,是用系统带的UItabbarController
-
按钮超出父view,业内怎么解决, iOS有提供什么方式 A:(不记得了)没做过,但扯了响应链
-
讲一下你了解的响应链,是做什么的
-
所以是先找到view,然后再去响应,(顺带好心地解释了按钮超出的问题,重写系统方法,更改判定范围)
-
极客学习响应链
-
按钮超出,如何重写hit test
-
运行时相关的内容会用到什么呢,有哪些特性反映出OC是动态语言,包括哪些运行时特性比较好用可以帮我们实现复杂需求 A:消息转发机制 Q:那平时怎么去使用到这样的特性 A:selector
-
[ ] 学习OC运行时特性及用处,并整理在这里
-
OC内存管理有哪些了解,怎么管理对象的内存
-
那自动释放池的机制是怎么样的呢,自动释放的时机如何去选择 A:函数释放后
-
学习自动释放池,口述,写在这里
-
那有遇到过循环引用的问题,什么情况下会造成循环引用的情况 A:(回答了一下,扯到了可以用弱引用去避免)
-
那弱引用怎么避免造成循环引用 A:引用计数不+1 Q:也就是一个引用计数不加1,一个加1
-
学习weak的原理 www.jianshu.com/p/e1a1a493c…
- 补充:循环引用:类的两个实例对象 A和B互相引用;引用关系形成环
- 手动打破:代码给一方赋值置nil
- 弱引用会在其指向的实例对象被释放后自动变为nil
- 原理:
- 初始化时
[A SetFriend: B];
[B setFriend:A];
-
weak和assign有什么区别,因为平时assign也不会对引用计数加一 A:weak是用来修饰对象,assign修饰基本数据类型
- 更正:
- weak只可以修饰对象,而assign可以修饰对象和基本数据类型,但适用于修饰基本数据类型
- assign修饰对象会产生野指针,修饰的对象释放后,指针不会自动被置空,此时向对象发送消息会崩溃;而适用于基本数据类型等值类型,因为值类型会被放入栈中,遵循先进后出原则,由系统管理栈内存。而引用类型(即对象),会被放入堆中,需要我们自己手动管理内存或通过ARC管理
- weak适用于delegate和block等引用类型,因为weak修饰的对象释放后(引用计数值为0),指针会自动被置为nil,不会导致野指针,不会循环引用,很安全
-
平时多线程是用NSOperation多还是GCD多 A:(其实不知道用啥多,随便回答了NSOperation) Q:为什么用NSOperation,因为我理解GCD使用起来是比较方便
-
极客学习使用GCD 与 NSOperation ;重点GCD,以后问也说GCD多 juejin.cn/post/729891…
- 假如问GCD了解多少 A:GCD是Apple开发的一个多线程编程的轻量级的解决方法,底层是用C实现的;GCD自动调度队列、资源、信号量;对于开发者,只需要告诉GCD要执行的任务,如何执行即可,不需要关心线程管理;简单使用方法是创建队列,用同步或异步方法执行;常用方法,dispatch_async,dispatch_sync,dispatch_once等,提供的队列有主队列、非主队列(四种优先级high,default、low和background),自定义队列(需要自行定义并行串行)
-
GCD与NSOperation的异同
- NSOperation是GCD的封装,是面向对象的设计,相比GCD可以设置取消、暂停、挂起任务的执行
- GCD底层是C写的系统API,执行和操作简单高效;NSOperation开销会大一些
- NSOperation面向对象的设计,可以继承NSOperation自定义子类实现相关功能
- GCD添加依赖通过dispatch_barrier_async,NSOperation通过addDependency添加任务的依赖
- 总结:GCD使用简单高效,但一些复杂操作实现较复杂,NSOperation可以快速实现一些复杂操作
-
Swift是一直有在学习吗,还是工作中有用到才去了解 A:参加工作前有学习过,工作中有一些特性不会就去官网查(扯到了特性所以后面被问,其实这里我的意思是有些不会的再去查,但这说明没学到位,可以说特性,但是需要了解一些特性)
-
那对这几年出现的新特性有了解吗,SwiftUI和一些并发编程 A:没了解
-
优先级低,了解swift特性,简单使用
-
说一下你了解的MVC和MVVM A:(简历上写了,所以被问了) A:(回答得很混乱)
-
学习MCV和MVVM,口述模拟回答,并写在这里
- 你们的网络是用HTTPS还是HTTP A:都有
- 了解一下能不能存在都有的情况,复习HTTPs的加密方式并口述,并写在这里
- 代码管理用git,怎么管理代码分支,多人协作上该怎么样去做这个管理 A:(如实回答了)
- 搜一下业内怎么管理代码分支
- 是基于哪个分支给测试测
- 写界面是用纯代码还是可视化xib A:我主要用纯代码 Q:那其他两种方式也有了解过?
- autolayout怎么做到自适应?
- 极客学习autolayout 口述并写在这里
- 私有的组件仓库,你们打版本上去私有仓库,会做校验吗,podspec是否规范,是否能正常拉到代码 A:说了有template模版,会校验 ,吧啦吧啦有别的部分做了 Q:就是有自动化流程?
- 极客学习cocoa
- 学习cocoa私有库怎么校验,口述、写下来
- 如果是一个纯粹的Swift项目,想用一些OC,有哪些工作需要做 A:编译选项,桥接,(学过,但逻辑不清,且不记得)
- 复习Swift混编OC,及OC混编Swift,整理在这里,并口述
- 平时是用delegate多还是block多,或者有没有别的好用的回调方法 A:两种都有用
- 基于什么考量去使用哪种 A:delegate比较公用的时候会用,block比如点击之类
- delegate与block的使用选择,场景;整理写在这里,口述
- block的实现原理
- 学习block实现原理,写、口述
- 如果线上出现崩溃,怎么去定位 A:吧啦吧啦,没遇到过,但是看别人怎么做 (其实想问的是异常捕获)
- 有了解过iOS异常捕获的方式吗,自己去实现,然后上报到服务器
- 学异常捕获,做上报到服务器,整理,口述
- 平时会去阅读第三方库代码,有没有相对熟悉的第三方库 A:我有看过yykit(当时名字都不记得了),还有AFNetworking (其实根本就没咋了解)
- 那AFNetworking是用的哪个版本
- 现在iOS NSURLSession已经比较完善,为什么还要去用第三方网络库,有哪些优势
- 去了解AFNetworking库
- 了解优势;口述,整理
- 职业规划
- 参考这个链接写职业规划,并口述,吹
另一个面试官问的
- 在项目中有什么亮点
- 思考一下什么亮点,亮点在哪,怎么做的
- 在工作开发中常用的数据结构,分析一下你说的常用的数组和字典的时空复杂度
- 简单复习一下个数据结构的时空复杂度
- 冒泡排序、快速排序的时空复杂度