一份中规中矩的 iOS笔试题

一、背景

      因为一些原因,我从公司离职,在此之前,我需要帮忙招聘一个新人来做我的工作,于是就有了这篇文章。

  由于公司项目16年就已经上线了,前同事写的项目中,有用xib、storyBoard、代码自动布局,各种能想到的坑,想不到的坑,所以我期望能找一个基础比较好(只有基础好,才能识别出来老项目中的坑),对OC技术有一定的深入了解(一样的道理,项目老,需要做新的改变的时候,总不能一个个去改,如果利用OC技术技巧,有时候会事半功倍),毕竟是金融行业性质app,需要有一定的安全知识,在上述前提下,我自己写了八道中规中矩的笔试题,每道题给5分钟思考时间。

 

二、笔试中出现的问题

  笔试中出现了很多答案,一度让我怀疑自己是否出题出错了,容我细细道来:

  1. 属性是开发中最常用的东西,然而这道题很多人都答错了,对,你没看错,不是答不全,是答错了😝!

    属性后面跟的修饰符有,是否原子属性,(nonatomic,atomic),默认是原子属性(atomic),然后有40%的人都说是(nonatomic)。。。

    读写属性,(readwrite,readonly),默认是(readwrite),这个没有人错,有人会记不起来,我稍加提示,基本上都能答出来;

    内存管理方式,(strong,copy,assign,weak),默认是(strong,assign),这块也很少有人错,有几个写的默认是copy,其他都比较好;

  第一题确实是很基础,很常用的东西,如果这都答不对,只能说抱歉。

 

  2. 第二道题也是考察对属性和实例变量的理解。

    属性默认情况下(也就是@synthesize环境下)是自动生成setter+getter+ivar,同时重写setter和getter,系统就不会自动生成ivar,如果需要修改,可以自己申请一个_ivar变量或者修改为@dynamic,更多更细的答案,请Google一下,答案很多的。

 

  3. 第三道题40%的人给我的答案都是防止循环引用???还有40%的人给我的答案是为了防止提早释放,我一般情况下会跟一句,那么用strong可以不,大部分人就不会继续说了。。

    1).  防止循环引用是什么鬼,不会咱不写,说不会嘛;

    2). ARC环境下确实是可以用strong的,ARC环境下block的操作还是做了copy,但是一般情况下,为了保持一致,用的是copy,但是在MRC环境下,是不能用retain代替copy的。因为在block的内存默认是在栈上,作用域在创建时候的当前上下文,出了作用域,调用的时候,就是野指针,所以需要copy到heap(堆)中。

 

  4. 第四道题很少有人答错,都是老生常谈的,循环引用产生的原因就是:强强引用又相互等待对方先释放。解决的方法就是找一个合适的节点破环。弱引用是个好的处理方式。

    这儿需要注意一下,有时候我们不能单处的使用弱引用,举个不恰当的例子,我在A Controller里面做了一个网络请求,请求结果用block执行,会修改A中的某些属性,但是网络请求是个过程,用户进入到A的时候,懒得等待,就退出去了,这个时候,网络请求还没有结束,然而因为你用了weakSelf,A被提前释放掉了,等网络请求拿到结果处理的时候,去执行,会出现野指针引起崩溃。解决方法可以用strongself,可以在A的dealloc中取消掉网络请求,或者在block中判断A是否还存在。。。 

 

  5. 缓存策略在我之前的文章有写。有意思的是有20%的人写了缓存有文件缓存、数据库、内存缓存。对于这些答案,我只能说打扰了。

 

  6. 设计模式说实话还是比较重要的,思路好,架构好,以后维护都会方便很多;相反,设计模式不懂,乱用,重构项目的时候,简直就是一场灾难,对此我深有体会,修改之前的代码:

  

 

  7.  tableView的卡顿:本来我是想自己去写一点点体会,但是这篇文章讲的好多了,链接给上 这儿

 

  8. 消息发送机制,以前有总结过,流程图如下:

 三、简历中的问题

  第一次当面试官,筛选简历也交给我了,有几个我比较注意的点,也一并分享出来:

    1. 由于是智联简历,都是模板化的,所以格式上都一样,但是还是尽量少有错别字,涉及的专业词汇需要注意大小写;

    2. 简历需要真实,碰到过一个iOS开发6年的经验,有几份跳槽经验,各种leader头衔,人在上海,但是工资从3年前就是10k-15k,大哥,如果这个薪资是真的,那么就说明了你的能力真心不咋的,如果这个薪资是假的,那你不是自己找不自在呢? 

    3. 简历尽量体现出来一些东西,有一份简历,薄薄的一页,5年经验,每个项目经验一到两行,玩呢?两行基本上刚介绍了项目是个什么项目吧?

 

四、我面试碰到的一些难题

  人在江湖飘,总是会挨刀,我面试着别人,也被别人面试着,也有碰到过一些有意思的、难得题目,记录下来;

  1.  Q:给TestObj同时添加两个category,都实现test方法,会有问题吗?

    A:不会,category添加方法是在运行时将方法前插到obj的方法列表中,方法查找过程总是从方法列表中找到第一个执行。

    Q:那么可以更改吗,比如两个category分别是A,B,目前是A先加载,B后加载,我想要达到执行A中test方法?

    A:更改A,B的加载顺序,在build phases中,compile sources中拖动A,B的上下顺序,从上到下依次加载。

  Q:现在testObj中有三个test方法,我不想执行category中的test方法,只想执行他本身的test方法,可以吗?

  A:...      

    系统方法在查找的过程总是在碰到第一个test就不再往下查找了,但是剩下的两个test方法还是在method list的后面,我们需要自己用runtime继续往下查,按照category的规则,testObj的test方法一定是list里面最后一个,所以我只需要保存最后一个IMP,然后执行。

  Q:具体一点,怎么做呢?

  A:...

  (当然不可能现场写代码了,这个是后续我自己写了一下demo)

  实现这个方法

调用的时候这么弄:

  2. Q:常用的cocoapods是动态库还是静态库?

      A:sorry,没有好好的去了解过这块。虽然我也经常用这块,甚至还自己编写过私有库,但是对这块没啥了解,😓(场面一度很尴尬)

      这儿有唐巧大神早期写的一篇cocoapods的介绍,比较全面。传送门

  3. Q:多线程有用过吗?

   A:有,经常使用GCD,同步异步是最经常使用的方法,我们做单例的时候喜欢使用的dispatch_once,还有dispatch_grop,还有grop中需要等待前面N个线程完成之后,再开启后面线程的dispatch_barrier_async,所有线程都做完后,必须做的dispatch_group_notify,还有信号量dispatch_semaphore_t,信号量创建为1的时候,可以当成一个互斥锁。

    Q:哦,对锁了解多少?

    A:(一不小心就跳到自己挖的坑中了...)

    这儿是一篇写的比较好的关于iOS锁的理解文章,大神移步:传送门

    还有这个:这儿

 

posted @ 2018-09-16 17:26  goldBlack  阅读(220)  评论(0编辑  收藏  举报