百度网盘iOS实习生 三面总结

百度网盘

公司: 北京百度网盘
时间: 2018-09-26
应聘岗位: iOS实习生
结果: 一面二面过,三面凉


一面:

  • 简述iOS的Runtime
  • [p setName:a] 转换成runtime的写法

    ojbc_msgSend()

  • 假如某一个类中没有func1方法,如果外部调用[p func1]时调用已写好的fun2方法来防止崩溃

    重写resolveInstanceMethod方法,动态添加func2方法

    class_addMethod([self class], sel, (IMP)func2, "v@:");

  • runtime消息转发原理

  • runtime中是如何知道一个对象所属的类

    isa指针

  • 接上,isa指针是什么类型,里面有什么

  • 简述ARC中 atomic,nonatomic,assign,weak,strong的区别

  • atomic一定是现成安全的嘛?

    面试官提示: 不是,例如NSArray *arr如果用atomic的话就存在不安全问题,因为atomic修饰的是arr这个指针,也就是自身所占用的8字节,但是arr指向的实际数据占用的n字节没有任何限制。

  • ARC中weak和assign有什么区别

    weak只能修饰对象,assign能修饰基本类型和对象。当都指向对象时,如果对象被释放,weak会自动赋值nil,assign不会,这样就形成了野指针。(对nil发送消息是不会crash的) 总结在ARC模式下指针对象一定要用weak来修饰,基本类型和结构体用assign

  • strong和weak的不同

  • strong和copy的不同

    可以考虑NSMutableString

  • weak(弱引用)的实现原理

    面试之前看到一篇推文就带过了,没想到被问到了。
    从历年 weak 看 iOS 面试,看看你卡在哪一年?

  • 简述 点击一个按钮时,整个事件的响应链

  • 用MySQL设计一个学生选课管理系统

  • 查出选三门课以上的同学

  • 查出没选课的同学

    设计三个表 courses students c_s(课程学生关系表)

  • 有一个int二维数组,每行,每列都是数据逐渐递增,如何快速的找到一个数

    第一遍我答的是按照每行最后一个数与所求数的大小,去确定在哪一行。
    第二遍我想的是每次都以数组的中心点为基础去确定在田字格的哪个方向,然后按照这个思路去递归查找
    (应该是剑指Offer的)

  • 接上,一维递增数列,手写二分法去查找一个数是否在该数列中。

  • KVO的实现原理

    这个题目听的Hank老师的公开课

  • 简单介绍GET和POST的区别,以及介绍一个HTTP请求的组成部分

    请求的Header和Body

  • 简述KVO,block和通知监听value变化的不同。

  • GCD的几种常用函数

  • 了解GCD栅栏函数吗,怎么用

  • 解释同步和主队列死锁问题

  • 简述 static 和 const, const NSString *str 和 NSString * const str 有什么区别

    总结

一面整体不算难,可能有一些琐碎或者不起眼的基础知识被我一眼带过了,weak和assign的区别,时间响应链,weak的原理…所以基础知识很重要。runtime的基本应用和原理要好好理解,毕竟OC是运行时的,不问Runtime就没啥意思了。


二面:

  • 简述MVC,V和M能通信吗,MVVM又是什么
  • 简述计算机网络的五层协议
  • 用过dispatch_once吗,主要用来做什么

在单例模式用到过

  • 为什么要用dispatch_once,他是线程安全的吗?为什么
  • 常用的线程锁
  • 常用的设计模式,简述观察者模式和工厂模式
  • 简述你开发中常用的库

我列举的SDWebImage,MJRefresh,AFNetworking

  • 上述库你认为哪一个设计的更好,为什么
  • ViewController的生命周期
  • weak和assign的不同(一二面都问到了)
  • 深拷贝和浅拷贝的区别
  • 堆和栈的区别
  • block有哪几种(3种),区别是什么
  • autolayout的实现原理,计算公式
  • 手写快排
  • 手写二叉树的翻转
  • 简述红黑树和B+树

总结

由于仅大二水平,计算机网络还没有学,所以题目没打出来,不过这也不是理由。多线程仅局限在使用层面,GCD的原理没有接触,线程安全没有接触。常用框架没读过代码,调包侠一个。生命周期为基础知识,忘了。
三种block之前没接触过,所以区别还是不太清楚(其实也不算没接触到,比如要修改block外的变量时要用__block,这里就涉及到该点)。数据结构GG。感觉能过二面完全就是侥幸。

三面:

三面由经理面试,主要是介绍自己。

  • 介绍自己,介绍自己学过的课程(题主为学生),着重介绍自己做过的项目。
  • 分析每个项目中自己做的部分
    • 校园应用: 主要是后端,没过多问
    • 小学堂: 问到哪里用到了KVO,项目中学到了什么。
    • Seek: 问我做了哪部分(游戏对战,提词之类),由此引出Socket。问学到的东西,(我也不知道为什么每次问这一点我都答不上来,因为我觉得我是在项目中巩固和熟练知识)
  • 引出Socket: Socket原理,心跳包的监测,SRWebSocket的使用
  • 同二面:计算机网络的五层协议
  • 介绍自己觉得最拿手的语言或者技能

无奈,说出PHP

  • 由此引出,为何从后端转到前端,对前端是怎样理解的

经理一直强调这个题没有坑,但是确实还是耗时很长的一个题目,首先我先接触的PHP,做过一些小项目和api之类的工作。后来接触iOS,觉得更喜欢去和用户打交道,通过前端的交互,把后端更强大的功能展示给用户,所以我觉得一个项目能给用户带来印象的,首先是它的前端界面和一些交互逻辑,还有一些功能的实现,后端功能再强大,前端做的不好用户也不会觉得好用,然后一点就是因为喜欢,没有太多的原因。
但是还是太肤浅了

  • 了解C,C++,JAVA,Python吗
  • 了解Golang吗,假如有个项目需要我来写,给我10天时间,如何学习Golang并按时开始写生产代码。

    我的回答是先找本书看代码的风格和语法,然后看一些实战的视频,跟着快速撸一遍熟悉逻辑。(面试官提了一句 花时间看基础和语法,我就说看语法时间少,实战多用点时间)

  • 线程和协程的区别

  • 被问数据结构的掌握情况,有没有自己实践过某种数据结构

  • 最近读过的印象最深的一本书(计算机类),印象最深的段落

  • 常用的设计模式,MVC属于什么设计模式

  • 印象最深的一个BUG

这种印象最深的我觉得以后我可以整理一下,因为这种问题我会紧张的想不到

  • 被严重怀疑大三哪来的时间实习

总结

面试官对我的印象主要是基础不扎实,太偏向于应用层,或者太偏向于界面,应该将自己的知识面往下拓展拓展,不要知其然而不知其所以然。


这次面试给我很大的感触。首先就是基础知识的问题,很多东西都被我草草带过了,结果是一个很重要的知识点。大部分地方只知道怎么用而不知道底层原理。现在终于知道学校上的课有什么用了,数据结构、算法、计算机组成原理等等,这些东西根本应付不得。所以我想用年前的这段时间,将我的基础知识补上。

最后的最后,我问了三面的经理一个的问题:

我把一个段子讲给他,

应聘者: 我需要一份工作
老板: 你要先有经验
应聘者: 但我需要工作来获得经验
老板: 那就工作啊!
应聘者: 这就是我今天为什么来到你这里
老板: 你的经验呢?
应聘者: 那我怎么在没工作的状态下获得经验
老板: 工作!

我问他,作为一个高层,是如何看待经验或者项目经理这个问题的。

他告诉我说,对于学生,经验这部分肯定没那么多,如果我们要培养一位实习生,是要付出代价和承担风险的,我们不能去冒任何的风险。我们是否接受一个实习生,主要看的是他是否值得我们去付出这个代价,如果可以的话,对双方都有利,何乐而不为。

So,加把劲吧。