历时快2个半小时,因为他说他把一面和二面放一起,啊,好想哭啊,问了超级多问题,跟项目毛都没关系,为什么不问问我Swift,HTTPs/TCP/UDP也没问,哭了,问题应该有所遗漏,哎,面一面真的有好处啊
一.自我介绍
二.iOS相关
setter和getter可以同时写么
不能么?QUQ,我说可以,然后他问我有没有什么问题,我。。。
block
说说block的理解,我说了匿名函数+上下文捕获变量,说了三种block,说了捕获变量怎么存在block结构,然后又问我为什么要设计,block具体怎么执行,这个我不会QUQ
strong 和 copy的区别,为什么NSString要用copy
这个没啥
block / delegate / notification的区别
我扯了它的用法,一对一or一对多的关系,然后一直我使用场景,我扯了下,不知道满不满意
category与extension的区别
大概说了下category的特性,extension的用法与使用场景,然后问我在编译上的区别,我说extension的话,生成实例会把成员变量放到结构体(就是那个objc_class)里面,函数放到函数列表里面,category不会,他问我category的方法是不是动态加载,我说是,然后问我在什么时候加载的,噢,我不知道,我偷懒啦,category的原理实现我没看
消息的发送与转发
说了下objc_class里面有啥,然后从objc_msgSend函数说到查找类的过程,消息的3个转发,说到第二个方法的时候,问我,消息转发的forwardingSelectorForTarget的使用场景,问我有没有用过,我,真的只写过demo,实际应用没用过,哭啦,然后说让我想一想有啥场景可以用,我说,它可以把A的某个类转发到B的某个类,就可以自己另外写一个类,一个方法,然后去替换那些不能重写更改的方法。。。
然后问我方法交换使用场景,我说了之前写越狱的时候用得比较多,可以去替换系统的一些方法,比如旧代码要替换某个方法,但很多,就可以用,然后问我怎么交换,会不会有问题,我。。。问题我记得有的,哭啦,但我忘了,好像是会循环调用QUQ
app 在main函数执行前发生了什么
我扯了UITouch,SpringBoard,runloop,他说方向不对,对不起,我不知道
事件分发与响应链
我具体说了从UIApplication到第一响应者的查找过程,然后第一响应者如果没有响应事件怎么进行下一个响应者,也扯了UIControl、手势的优先级,然后问我,确定了某个响应者,系统怎么知道要去执行事件,我说是touch系列的事件,我也不知道他是不是想问这个
runloop
我说了下runloop对象与线程的关系,它的作用,它的模式、事件源、定时源、观察者,然后问我在子线程调用主线程(即线程间通讯)跟runloop有没有关系,我说有,应该是source1,然后让我举一下用runloop的例子,我说了定时器,说了常驻线程,然后问我怎么保证常驻线程,我说用NSPort,然后问我为什么要用NSPort,又问我runloop结束的条件,我说线程结束的时候,又问,还有么,我懵逼,然后他说,不存在事件源、定时源、观察者的时候,就会结束,所以要用NSPort来保证它不结束,保证线程不断
autoreleasePool
我说是多个autoreleasePoolPage以双向链表的形式组成,然后说了下page的哨兵对象,问我哨兵有什么用,我说用来确定autoreleasePool的位置,然后问我主线程autoreleasePool什么消耗,我说runloop休眠的时候,啊,还有一些,我有点忘了
setNeedLayout与layoutIfNeeded的区别
我说一个是标记要更新,但不立即更新,另一个如果有需要更新,就立即更新
多线程
我想把4个都说了,一开始说pthread,他问我用过么,我立马说,没有,然后说了NSThread、GCD、NSOperation 及它们的区别,然后问我最常用哪个,我说GCD,然后又问我,同步要注意什么,我说死锁,问我GCD的栏栅和组分别是啥,问我GCD的某个东西,啊,忘了是啥,反正我不知道,还问了组的enter和leave的使用场景,我举了个例子,说比如有个异步线程从后台获取数据,有个异步线程从本地获取的数据,两个都完成了再去对这两个数据进行过滤,然后我问我怎么用,我说了下
某个很大的app,如果有1000条线程在跑会有什么问题
我说,1000条,那么多,肯定CPU消耗大,CPU就那么点,要大家轮着去用,肯定耗时,可能还有线程安全的问题
线程安全
问完上面那个,立马问我什么是线程安全,我说,就是多个线程访问资源的结果和多个线程串行访问的结果一样,线程安全怎么解决,我说一般用锁,最常用的是NSLock,然后其他只是知道,比如条件锁、递归锁,问我什么是递归锁,我说就是比如NSLock如果在同一个线程,多次使用会造成死锁,但如果用递归锁就不会,我说的不对么,感觉他有点没听懂,然后我说了自旋锁,问我什么是自旋锁,我说就是一个新线程会不断循环去访问是不是可以访问某个资源,然后问我使用场景,我说,我没怎么用,问我那什么情况都可以用么,我就说,不行,循环去访问的话,肯定耗资源啊,然后就说,那某个操作很耗时就不能用咯,我说是呀
然后问我知不知道信号量,我说知道,问我使用场景,然后我说了下保证线程同步,就是某个函数里面先有个异步线程,然后拿到这个异步线程返回的结果再进行下一步,然后问我还有其他吗,我说,就保证线程安全,相当于加锁解锁,然后说信号量初始化为1和大于1有区别吗,我说有啊,大于1可以限制线程数,然后问我假如有两个线程同时访问一个资源,初始化为多少,我说1
Mach-O
问我知不知道Mach-O,我说知道,然后讲了下它是一个二进制文件,包含头、加载命令、数据段,问我它提供了什么信息,我说会告诉你它的架构,是不是arm64那些,然后问我arm64与arm32有什么区别,32位CPU和64位CPU有什么区别,对不起,我不知道QUQ
还问我知不知道 FaceHook(好像是这个吧),然后说如果我知道的话,就了解Mach-O那些东西,我说没听过,QUQ,Mach-O 是之前搞越狱的时候知道的,呜呜呜
内核态和用户态
问我知不知道内核态和用户态,我记得的,操作系统某一页有它的图,哭了,但我不知道
bound 和 frame区别
这个比较简单,然后问我如果一个view旋转了45度,frame会变吗,我想都没想,就说会,然后问我,如果变了会变成多少,傻了,啊啊啊啊,我沉默了。。。这个问题说实话从来没想过QUQ
离屏渲染
我忘了啊啊啊啊,明明专门去看过的,还问了例子QUQ
dispatch_aysn_after 和 sleep的区别
我说sleep是立马阻塞线程,额,after 我疑惑了,从来没想过,我说我不确定,他让我猜,我说应该不会,又问我为什么,我说,因为异步执行,我不知道啊啊啊啊啊
HTTP1.1与HTTP2.0
呜呜呜,宝宝前两天才在群里说过,我不知道QUQ
NSURLConnection 与 NSURLSession的区别
我说,Session比较快,因为用了HTTP2.0,然后问我还有么,我。。。不知道QUQ 时间太久了
AFNetworking
问我有没有用过AF,我说有,然后让我简单说说主要有那些类,我简单说了下那个序列化和Manager的类,然后问我里面有没有线程相关的,我不确定啊,然后说有,QUQ真的忘了,啊啊啊啊
三. 数据结构和算法
有哪些数据结构
我说,数组、链表、树、栈、队列、图
有哪些排序算法
我说,选择、冒泡、插入、快排、合并、堆排
快排
先问快排的时间复杂度,我说O(nlogn),然后问我最坏的情况,我说反序,然后让我说一下快排的思想
哈希
问我哈希是怎么构建的,随便说了下,对不起,我忘了QUQ
一个数组,给它的头添加一个数据,时间复杂度是
我说O(n),是的吧
怎么判断一个链表有没有环
画了下,想了想,说了下两个指针,一个快一个慢,如果有环,那么它们最终会相遇
树的遍历
我说有前序、中序、后序、层次遍历,然后问我什么是前序,我说先访问根结点,再访问左子结点,再访问右子结点
输入一个N,获得1到N,这几个树,问能有多少个二叉搜索树,比如输入3,有1 2 3,那么有5棵搜索树
哭了,我不会
最后是上机题:写一个栈,push跟平时的stack一样,pop的话,pop出栈里面重复数最多的,如果大家都为1,那么pop栈顶,比如push: 5 , 7, 5 , 3, 5 , 7,然后pop : 5, 7, 5, 3
四. 有什么问题
我问了技术、团队、项目这些
然后问他对我有什么意见,他说:
- 回答的思考时间有点长(虽然我觉得也不长的说QUQ),给他的感觉是我是在记忆里搜索,是看别人的文章,记下来的东西,而不是自己验证过的东西,说他问的东西都是平时用的,应该能很快回答
- 建议我把每个东西都好好动手做一遍,从开始到结束,遇到的bug,怎么解决,都去搞一遍
- 数据结构和算法那些他们都有要求,刷题也好,都要会