记阿里四次的实习面试

                      阿里面试
昨晚面试阿里面了一个多小时

这个是移动安全部门的,先上来说内存管理,我说这个太大了,你给我说具体的一个方面,他说你说一下autoreleasePool的底层实现,听完这个问题其实我挺高兴的,因为我知道这个底层实现,我就结合栈,NSRunLoop,线程给解释了一下,其实我解释完那个面试官挺惊讶的,我以为完了,他又往深地问:你说线程与RunLoop有关,那你知道在线程的什么时候,RunLoop进行Pop操作,这个我就很自然地说在线程销毁的时候,他说:是吗?你确定?一听则语气就知道不对,但是我又不知道说什么,我就一口咬定是。他说:额。。。好,下一个。。。。说一下Strong,weak,assign,copy区别,这个简单嘛,但是关键的点还是得注意。最后是让我在自己的角度说一下对MRC和ARC的理解,我就说其实它俩实现机制是一样的,他问ARC是在哪个时期进行操作的,我说在编译期。他说:虽然现在有ARC了,你觉得你做项目的时候还会遇到内存泄露的问题吗?我说有啊,我就遇到过啊,我用那个analyze分析内存的时候就遇到过,我那个表视图有一次没有写if(cell == nil)这句话,就发生了内存泄露,其实我说这个内存泄露就是为了让面试官问我那个表视图的重用机制,他就问重用机制了,我就顺带说了一下,他又让我说那个名字长的要死的API: dequeueReusableCellWithIdentifier:(NSString *)identifier,他说你没有重用机制的时候,你觉得你那个cell是重用的还是新创建出来的,我说肯定是重用的啊,新创建的没有被利用才会产生内存泄露。还有内存泄露就创建了一个Model先初始化了,然后让它指向其他对象,这样就会产生内存泄露,刚创建的那块内存就没用,还有使用代理的时候,把delegate的属性设置成了strong,造成循环引用会造成内存泄露,其实这个错误我没犯过,只不过感觉说出来比较好一些,我以为他会继续问我代理,通知,kvo之间的比较之类的,然而他没有,他问的是站在自己的角度理解一下block,以及在哪儿用过,我就说block相当于一个匿名的函数,执行代码块,当后一个视图控制器给前一个控制器传值的时候用过,他说你具体说一下执行过程,我就把整个定义以及执行过程说了一遍,他也没问啥。他又问堆和栈的区别,我就从管理者,执行效率,地址分配,产生碎片问题,以及堆区如何利用空闲链表具体地进行分配我详细地说了一遍,并且堆区分配的四种算法(首次使用,循环首次适应,最佳适用,最坏适应)我也说了,我觉得这个就能知道多少说多少吧。好吧,内存管理终于说完了,我觉得这个面试官和第一次那个不一样,绝对是很牛的那种,就是一个知识点会一直问一直问。。。。。。。
 
下来是你知道key chain吗?我就没听过,我说:啊,什么?是响应链吗?我只能往这方面说,因为key  chain我确实无从下手,我只能说响应链,毕竟也是带个链字,他估计看我内存答得还挺好的,就说不知道没关系,人人都有不知道的知识点,你刚才提到响应链了,那你说说响应链实现机制,我说这个得从两方面说:一个是硬件,一个是软件,就说了一下利用hit--testing方法怎么怎么滴说了好长时间,他说加入现在你要拦截一个事件,你把这个监听会设置哪里?View? UIViewController?UIWindows?UIApplication?,当然这几个我之前提到了,我说这个我觉得只要在这个视图所在的父视图或者离他最近的视图控制器中设置拦截或者监听就可以了,因为再往上的话能不能响应是一回事,而且在响应链上越往上所花费的开销也会很大,对应用程序的性能影响是很大的,所以在写响应的时候,最好第一步就能响应。我觉得应该还没说到他心上。。。
 
下来是问我知道什么设计模式,我是MVC, MVP,单例,代理,通知,观察者,他说那你给我讲一下KVO的实现,我说KVO只能用于一个对象去监听另一个对象的改变,不能对block或者selector反应,它的底层是这样实现的,这又说到runtime了,我觉得我解释完那个面试官挺惊讶的,他说你,平时怎么看到这些知识的,我就随便说了一下,其他设计模式也没问。下来问我有了解过runtime吗?我说了解过,我看过一点源码,什么类对象,消息底层实现机制。他说你为什么会看源码,我说OC的所有代码最终都会转化成C函数或者结构体去执行,我觉得了解这个是很有必要的,可以知道代码的底层执行情况,当然真实原因是我为了面试才准备的。。。他就问那个类对象的底层布局,我就说了一下那个结构体的内部构成,说完他让我着重说一下那个isa指针,元类里面都有什么(存有类方法,这个得说,因为我们用的最多了),NSObject元类的super指针指向什么?Isa指向什么的,再问了一下消息的实现机制,我以为会问那个动态决议,消息转发之类的,应该是时间不够,他就简单问了一下。Runtime就这么多
 
下来是iOS的沙盒机制,这个没多问,就问了一下基本的知识,问我用过什么,我说用过NSUserDefault和plist之类的,又问我在什么情况下用的,我就把具体怎么用的再说了一下,这个应该是面试官觉得没什么,就顺带提了一下就过去了。
 
下来是GCD,他说你为什么用GCD不用NSThread和NSOperationQueue?我说NSThread太底层,生命周期,线程同步不好管理。NSOperationQueue的话,虽然比GCD灵活,比如设置线程并发数,取消暂停等操作都比较方便,但是是要付出代价的,占用资源内存开销相应就大一些,我觉得目前我所遇到的问题GCD就可以解决,我觉得内存和响应性能应该才是应用程序所要考虑的第一要素。他说GCD里面有哪两种队列,我说串行和并行,他说具体一下,我说主线程就是一个串行队列,global queue就是并行队列。他说加入现在有一组任务,需要所有执行完了才能进行回调该怎么办?我说把那个queue和dispatch_queue结合起来用,最后用notify进行回调即可,他说在哪儿用过,我说下载一组动图的时候就需要用,比如美团那个加载奔跑的logo。。。下来问比如你有四个线程同时读写一块内存中的数据,要怎
么进行互斥访问:我说读不用考虑互斥的问题,写就需要了,因为正在问我GCD嘛,我说用dispatch_barrier函数可以解决,还有一个办法就是互斥锁,其实他想让我回答的解释barrier函数,但是说到锁了,又说了一下死锁的问题,这个可以结合项目具体解释说一下。他说你觉得GCD可以用于单例吗?我说dispatch_once可以实现,反正这个我觉得他挺满意的,又结合block问了一些。
 
让我现场想一个下拉刷新的控件实现,我桌面上就有这个demo结合UISrollView和UITableview的delegate说一下回调的一些内容,就可以了
 
已经过去能有30多分钟了吧,下来是项目优化。他说你遇到过崩溃的情况吗,其实我当时遇到挺多的,但是当时说的都是一些小问题,其实大的我也遇到过,但是我觉得说出那些大的崩溃的话,这个面试官一定会给我扯到底层的,到时说不清就完蛋了,我就敷敷衍衍地说了一些。我就说了一下我项目的优化,其实优
化是我这学期准备做的,我就说一个最low的,在表视图滑动的时候网络数据,在减速或者停止滑动的时候才加载,他说那比如用户停止滑动就一秒钟时间继续滑动,这个时候还加载吗?我说我目前的是加载的,没考虑用户的这个暂停时间,他又问如果网络现在很慢,你的图片加载不出来怎么办?我说那只能提示用户网络太慢,图片加载失败,重新请求,其实他想让我说SDWebImage,我说没用过,我解释我没用过的原因:我觉得现在我还是自己写一下实现比较好,等我自己写熟练了再用别人,学习效果会更好一些,比如刚开始的网络请求我就自己写最后才用第三方框架AFN,他说你看过AFN源码吗?我说看过,他说那你说一下里面有个取消和暂停是怎么实现的?我说我可以先说一下实现的总体框架吗,他说当然可以呀,我就把里面主要的类说了一下,以及每个类里面主要干了什么都说了一下,但是他说:总体框架还不错你确实看过,回到原来的问题上来,暂停取消操作具体怎么实现的?我晕了,其实源码我真的看了一点,但是我只是知道里面有这个操作,没仔细看,我说服务器那边直接取消,他说:恩?是这样吗?我知道错了,只得承认,这个功能我没仔细阅读,只知道有这个功能。我当时觉得这一面肯定跪了,他也没说啥,就笑了一下,说没事。我又说准备在我的足迹那块做一下缓存,他说你缓存的机制是什么?我说利用http请求头的 if-modify-since这个字段和服务器那边请求作对比,看最后被修改的时间是否一致,再加上校验值ETag值就可以实现,他说么清理缓存呢,我说利用操作系统里面那个LRU算法可以实现,这个就算完了,很奇怪居然没问我网络方面的。
 
好吧最后问我一个算法,其实我对这个算法还挺期待的,因为目前面试过问我算法的我还没有答不上来的,CVTE三个我都答上来了,他问的是,在一个无序数组中找第N大个数?我听了之后觉得不熟悉,我就想先排序再找,我说堆排?先排序再找,他说这是一种还有其他的,我说快排再找,他说你说一下快排的思想我说分治的思想,他又让我讲快排的思想,最后问快排的时间复杂度,最后坑的是问我这个时间复杂度是怎么推导出来的,这个我是真的不知道,我就结合二叉树说了一下,他说好你往这方面想,我想来想去就是快排啊,他说你想一下一些比较是没有必要的,我说对啊,快排可以不断缩小范围啊一些比较就是没有必要的,我真的不知道他要我说什么,再加上我当时应该有点紧张,实在想不出来了,真的那个面试官当时启发了我挺长时间,连我自己都觉得笨到极点了,但是我今天早晨百度的时候确实是快排之类的,虽然没有说到面试官心里,最起码也说的比较相近了。
 
完了,反正面试完挺失落的,挫败感特别强,真的,我想着二面就给挂了,有点伤心。
 

面试整个过程中,他对我回答每一个问题的情况都做了详细的记录,因为他有时候停下来会说等他一下,他大概记一下,然后才接着问。。。



现在HR面已经过去9天了,等待的日子真的不好过。。。。。。。

你可能感兴趣的:(ios,面试,阿里)