• Home
  • About
    • 杜玮的博客 photo

      杜玮的博客

      iOS小开发仔,objective-c、Java、C

    • Learn More
    • Email
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

阿里巴巴面经

27 Apr 2018

Reading time ~9 minutes

阿里巴巴一面问题

  • 上来先来一个自我介绍,然后问了一些项目的问题

    (略)

  • atomic关键词是绝对的线程安全吗,为什么

    肯定不是,atomic确保了操作的原子性,就是指两个线程读写同一个属性,总能获取到有效的属性值,但如果一个线程在连续多次读取一个atomic属性值的过程中,别的线程修改这个值,也是会读到不同的属性值。

  • 那在iOS中怎么实现绝对线程安全的加锁机制

    我回答了用自旋锁,后面他让我解释了一下怎么实现自旋锁,然后还让我说了一下iOS中的锁:@synchronized、NSLock、dispatch的信号量

  • ARC内存管理

    直接问他是不是想问我autoreleasepool,然后就说了autoreleasepool相关的内容。

  • 为什么要在block里面强弱引用变换

    当self持有block,而在block外面弱化了self时,当进入到block之后有可能会发生self已经被释放的问题,那样就会出现野指针的情况,所以需要在block中对weakSelf进行强化,避免self被释放的问题。

  • 针对上个问题追问在block中嵌套block是否需要再做一次强弱变换,为什么

    这个没答出来,后面我想了一下,内层block是被外层block中的strongSelf所持有的,这个strongSelf是对外层block中的对象进行强引用,只不过在block过后就会将对象释放掉,所以在内层block中再次调用self的确是需要对外层block的strongSelf再进行一次强弱变换的。

  • iOS app启动过程

    一开始我以为是问我appDelegate中的方法,后面他问我还有没有,我就说需要链接执行文件、动态库、framework等等。

    深入理解iOS App的启动过程

  • 系统报错unrecognizedSelector的流程,以及如何利用runtime对这个错误进行避免

    第一个问题:iOS调用方法的时候会在对应类中对方法进行查找,如果找不到则会往上对父类进行查找,还查找不到则一直往上直到查找NSObject类,还是没有找到的话则会报错unrecognizedSelector错误。

    第二个问题:iOS中对unrecognized selector的防御

  • Load和initialize方法区别

    +Load是一定会在runtime中被调用的,在类被初始化的时候调用。 +initialize是不一定会被执行,只有当一个类第一次执行类的一些方法的时候才会被调用。

  • 项目里面为什么要重构Model层

    (略)

  • 有了解过MVVM吗,对ViewModel有什么了解

    我说ViewModel就是用来存放不属于Model但是要让UI展示的逻辑的代码,然后能提供更好的测试性。

  • 算法题:斐波那契数列优化

    剑指Offer有

  • 有看过第三方的框架吗

    我说了SDWebImage,然后他问了SD的缓存原理。 SDWebImage图片缓存原理

  • 有了解过LRU算法吗,让你实现怎么实现

    LRU(最近最少使用算法),根据数据的访问记录来淘汰数据。实现我说使用链表,当用到里面某个数据则将这个数据节点拿出来,然后放到链表头部,当需要淘汰数据的时候就将链表尾部数据节点进行淘汰。

  • 有什么问题问他

阿里巴巴1.5面

刚面完一面没多久在走路就打电话过来说想让我打打代码。

题目

给定一个字符串,找到最长子串的长度,而不重复字符。

例子

给定“abcabcbb”,答案是“abc”,长度为3。

给定“bbbbb”,答案是“b”,长度为1。

给定“pwwkew”,答案是“wke”,长度为3.请注意,答案必须是子字符串,“pwke”是子序列而不是子字符串。

solution

阿里巴巴二面问题

第二天又打电话过来了,感觉这次面我的不是做iOS开发的

  • 自我介绍

  • 什么是内存泄漏,instrument中Leak检测内存泄漏的原理是什么

    内存泄漏就是应该被释放的对象没有被释放,一直保留在内存当中。第二题不会。

    关于第二个问题能找到的相关博客只有这个,但是他说的是allocation的原理。

  • 又问了一次ARC

    我又说了一遍autoreleasepool

  • 循环引用

    a强应用b,b又强应用a

  • iOS多线程有没有在debug或者开发中用过

    gcd

  • 那么让你做一个异步下载图片怎么做
  • 多线程重复设置图片问题

    一面中SD有相关内容

  • png和jepg在内存中占用的大小哪个多一些

    png

  • 为什么要重构Model层,重构完之后的架构是怎么样的

    重构完之后是MVC

  • 那说一下MVC架构

    M是Model,V是View,C是controller,model和view之间不能直接通信,需要通过controller来协调,controller可以直接调用model,model的改变通过Notification通知controller,并由controller直接操作view,而view通过action与controller进行交互,controller是view的数据源和代理。

  • 那iOS为什么要使用MVC架构呢,小项目直接一个文件写全它不就好了吗?

    讲真我好懵逼???然后我跟他解释如果全部都写到controller里面就会让整个controller代码很多,不方便维护,别人接手或者了解这个模块都会变得很困难。

  • 看过哪些库

    还是SDWebImage,然后追问我SD的缓存机制,还有内存命中率。(我感觉还是想问我LRU,但我当时没想到)

  • 数据库有用过吗,索引是什么

    我说我用过Realm,索引是用来快速寻找某些值,比如可以根据员工的姓作为索引在一个表中快速找到相关数据。

  • 事务是什么

    我问了是不是指ACID,他直接就说那就说ACID吧。

    A:atomic,原子性,一个事务操作只能成功和不成功,不存在中间状态

    C:consistency,一致性,事务必须保持系统处于一致状态,即多个线程进行操作后系统状态要保持一致

    I:isolation,隔离性,两个相同功能的事务同一时间只能有一个事务请求使用同一个数据

    D:durability,持久性,事务对系统的更改的持久的,不可以回退的。

  • 最后也没有让我问问题

阿里巴巴三面

当天晚上又来了一个电话,应该是技术总监

  • 项目相关
  • 项目遇到的问题
  • 为什么要重构网络请求框架
  • 重构完有什么改进
  • 有自己写过的小控件吗
  • 有用到在项目上面吗
  • github上有类似的吗
  • 相比github上的有什么不同
  • OC和swift你觉得有什么区别
  • 职业规划
  • 目前还有面试哪些公司
  • 工作地点在杭州可以吗
  • 家庭支持吗
  • 有考虑过考研吗
  • iOS学习经历

20分钟完了,等通知

阿里巴巴HR面

在下午视频面试

  • 自我介绍
  • 学习上的经历
  • 项目上令你印象最深的点
  • 为什么选择阿里巴巴
  • 为什么选择iOS开发
  • 对1688部门的认识
  • 目前还有在面试哪些公司
  • 腾讯和阿里选择哪个?为什么
  • 评价一下自己的性格
  • 工作地点有没有问题
  • 对你影响最大的人
  • 有没有考研的打算
  • 有什么问题问她

    (还好我先问了一下是不是最后一面,她说不是,那我就机智的没有谈薪资)

阿里巴巴交叉面

面试官是钉钉的

  • 做项目遇到的难点
  • 为什么要重构网络请求框架
  • 我看你项目经验挺丰富的,在做项目遇到过什么难点吗
  • 这个难点给你什么收获
  • 成绩
  • 大学期间有没有特别佩服的同学
  • 评价一下自己
  • 有了解过1688事业部吗

    其实并没有,然后我绕了个弯说我已经跟HR了解过挺多的了,让他以为我误解了他的意思是他要给我科普哈哈哈哈哈

  • 有了解过钉钉吗
  • 有什么问题问他

后面我说加一下他微信了解情况他说他们不用微信,只用钉钉,真是尴尬死我了

最后我拿到了Offer~~



iOS开发面经 Share Tweet +1