2021iOS面试总结day6

今天没有面试,我为了之前的offer后面就没有再投简历了。因为之前的hr问我什么时候可以入职,我说我周一还有两个面试,周二之前给你答复,很有可能会入职。我觉得做人应该讲信用,说到做到,既然同意入职了就不要再约别人家的面试,这样也是浪费其他公司的资源。结果还是我太年轻啊,我替别人考虑的太多了,别人可不会这么想,我很有可能只是一个备胎。第二天我又等了一天,还是没回复我,我下午就问他们入职时间确定了吗,又和我说晚点给我答复。晚上给我打电话了,最后说周五才能确定我的入职时间,我问她是不是能不能入职还不好说,她说是,说他们对让我入职的意向还是很大的。我直接被气到了,不想再说什么了,我说知道了然后就挂断了。之前问能不能确定,她说基本没什么问题,现在又改口这样说,这样的公司没有一点诚信可言。因为是这一家大公司,虽然给的工资不高,但是按照国家法定假日休息双休还可以调休,这点是我最满意的,而且做的是教育行业,是一件正能量的事情,可以为国家做贡献我也比较满意,最后才决定去的,可是没想到公司里面的人这样不守信用,结果另我很失望,浪费了我将近一周的面试机会。

这次的事情也给了我一个教训,不能轻信公司给出的承诺,即使给你发了Offer也不能完全相信,一直到入职之前都要一直面试。毕竟现在不靠谱的公司太多了。做人太实在很容易吃亏,实话实说都会被怀疑,一些公司就喜欢听假话。但是我也确实不是会说假话的人,良心有愧,只能说这个公司不适合我,什么样的公司找什么样的人。

来上海一周多了,我还没有开始投简历,之前都是公司找的我让我去面试,为了熟悉环境同时巩固一下面试题我也没想太多就去面试了,最后要么是公司我不喜欢,要么是岗位不适合我,结果都不理想。这周开始要自己投简历了,这样的话可以首先自己筛选一下,希望能有一个好的结果吧。

下次再收到面试邀请之前先问三个问题:

1.你们公司做的是自己的项目吗?

2.你们招的是原生开发吗?

3.你们的工作模式是大小周吗?

确定这三个答案以后再去面试,以免踩雷浪费面试机会。

今天刚刚公开简历就收到了面试邀请,有一家公司让我晚上六点去面试,我想今天闲着也是闲着,也不耽误后面的面试安排,那就去看看吧。面试之前我还在想怎么让晚上六点面试,不会六点不是下班时间吧,后来觉得可能他们有工作安排,所以下班以后再面试我,没多想就答应了。招聘要求上只写了要求熟悉OC还有网络,我觉得也没什么问题。坐了一个多小时的地铁,下了地铁以后一看还要走20分钟才到,公司的位置太偏远了,瞬间对这个公司没有好感了。但是既然答应了面试也不能爽约啊,硬着头皮去了,去的途中天已经快黑了,而且周边环境很荒凉,一直在想自己是不是被骗了。到了以后是一个像酒店一样的地方,心里更加忐忑了,找错楼层把10楼当成1楼,还被保安嘲笑一番。终于到了公司,首先接待我的是HR小姑娘,人长得很漂亮,而且说话特别客气有礼貌,来的时候问我住的远不远,走的时候告诉我怎么走,应该是目前面试这几家印象最好的了,不管面试成功与否,对面试者起码要尊重,这也代表了一个公司的形象。

后来填完表以后就开始面试了,公司一共不到十个人,竟然两个人一起过来面试我。一个是产品经理,另一个可能是后台开发或者是技术总监。先是技术总监问我会不会跨平台开发,我直接惊掉了,来之前我特意看了一下没要求会跨平台开发,这是想节省人力资源啊,看我会Vue想让一个人把iOS和安卓的活都干了吧。然后又问了我网络部分,问我知不知道BIO、NIO,了解过Restful吗,对于Restful的API如何网络请求我确实没用过,我问他们这些是干什么用的,他说他们的后台用的是PHP、不但包括Get、Post还包括Put、Delete等操作。我们之前公司的后台是用Java写的,没用过PHP,我还以为确实有这种请求方法我不知道呢。回家一查这些都是后台的知识点,iOS这边还用AFNetworking请求就行了。后来是他们的产品经理问我问题:

1.runtime在实际开发中是不是经常使用?

我在项目中确实用到的不多,我就实话实说了。后来我回家看了一下,我的项目只有在给分类添加属性的时候用到了runtime,用到的地方一共不超过三个文件。我还知道交换方法可以用runtime,但是实际项目中一次没用过。

为了防止下次面试再被问到还是总结一下吧,不管用不用得到,得知道有哪些用处。

1.动态添加对象的成员变量和方法

2.动态交换两个方法的实现

3.实现分类也可以添加属性

4.实现NSCoding的自动归档和解档

5.实现字典和模型的自动转换

其实也并不是项目中用不到,而是都在第三方里面用的,我们平时使用直接调用了,没有研究过内部的原理。

2.都用过哪些锁?

我想说我一个也没用过,直接这样说也不好。那就说一下有哪些锁吧,互斥锁、自旋锁、条件锁,前两天刚背过又忘了,后来他们提醒我还有递归锁、一般锁、分布式锁。

专业的回答iOS有八种锁,分别是:@synchronized(关键字加锁)、NSLock(对象锁)、dispatch_semaphore(线程加锁)、NSConditionLock(条件锁)、pthread_mutex(互斥锁)、OSSpinLock(自旋锁)、pthread_mutex(recursive)(递归锁)、NSRecursiveLock(递归锁OC)

3.说一下事件的传递机制和响应链机制

感觉在考我小作文,我不知道具体应该说哪方面,让面试官提示我一下他也不说,明显他也不是很懂。

正确答案:

事件的传递机制:

触摸事件的传递是从父控件传递到子控件

也就是UIApplication->window->寻找处理事件最合适的view

事件的响应链机制:

事件响应链的响应刚好和事件传递相反,事件传递是从UIApplication管理起点,逐级向下传递。而响应链则从下向上传递。最有机会处理事件的就是通过事件传递找到的 first responder,如果没有进行处理,就会沿着事件响应链传递给下一个响应者 nextResponder,一直追溯到最上层 UIApplication。若都没有进行处理,就丢弃事件。

4.说一下对Block的理解

我说了Block本质上是一个OC对象,然后说Block是函数式编程,都说错了他们也没反应,看来他们也不明白,我只要一直说就行了,他们也不知道对错。

正确答案:

block是封装了函数调用以及函数调用环境的OC对象。一共有三种block,分别是全局的、栈上的、堆上的。可以获取其他函数局部变量的匿名函数。

5.KVO的具体应用场景

我说给多个页面发消息的时候用,再一次说错了他们也没反应。

正确答案:用来监听其他对象的值,当其他对象的值发生变化时通知当前对象。在我的项目中用到的地方:1.日历选择时监听选中的日期来实现日历的颜色变化。2.商品详情页面监听滑动变化来控制当前显示页面是否是图文详情。3.监听WKWebView的加载进度控制进度条的颜色显示。

6.用过哪些设计模式?

我说我项目用的是MVC模式,又问我观察者模式、工厂模式、单例模式都用吗,我说用过,还有很多设计模式,我也懒得说了

7.多线程里面用过哪些,如何处理多个请求并发的情况?

我说用的最多的就是GCD,又问我10个网络请求如何实现并发,如何判断最后一个请求完成,这个确实没有接触过。

正确答案:

1.使用GCD的dispatch_group_t

关键代码:

```

dispatch_group_t downloadGroup=dispatch_group_create();dispatch_group_enter(downloadGroup);dispatch_group_leave(downloadGroup);dispatch_group_notify(downloadGroup,dispatch_get_main_queue(),^{});

```

对以上4行代码可理解为:创建一个dispatch_group_t, 每次网络请求前先dispatch_group_enter,请求回调后再dispatch_group_leave,对于enter和leave必须配合使用,有几次enter就要有几次leave,否则group会一直存在。当所有enter的block都leave后,会执行dispatch_group_notify的block。

2.使用GCD的信号量dispatch_semaphore_t

关键代码:

```

dispatch_semaphore_t sem=dispatch_semaphore_create(0);dispatch_semaphore_signal(sem);dispatch_semaphore_wait(sem,DISPATCH_TIME_FOREVER);

```

对于以上代码通俗一点就是,开始为0,等待,等10个网络请求都完成了,dispatch_semaphore_signal(semaphore)为计数+1,然后计数-1返回,程序继续执行。 (这里也就是为什么有个count变量的原因,记录网络回调的次数,回调10次之后再发信号量,使后面程序继续运行)。

原文链接:https://www.jianshu.com/p/fb4fb80aefb8

8.大文件上传怎么做,断点续传怎么做?

因为对方看了我项目里社区上有视频可以播放,问我做没做过录播,这个问题不只被问过一次了,我说怎么总被问到,原来是看了我app里面有视频播放的页面。目前线上app的社区版本不是我做的,我们app上线时第一版的社区是我做的,那时候还没有视频功能。在我离职之前技术负责人让我研究了视频上传,那时候只做了短视频上传,后来没要求上线,这个功能就暂时搁置了。大文件上传可能要用到分片上传,和上面那个问题一样,因为并发太多,所以要运用信号量等待的功能,等一个片段上传完了再上传另一个片段。如果看看文档我一定可以研究出来的。但是面试的时候面试官只问你做没做过,如果没做过就默认你不会了。既然这样我只好把原理弄明白,下次再被问到的时候把原理说清楚,也可以说自己做过了。

参考:https://www.jianshu.com/p/04425dd2099e

断点续传:

```

if(me.isPause==YES){//将目前读到了第几个文件的第几片保存到本地[selfsaveProgressWithChunk:chunk file:file];return;}

```

这个操作实际上和上传过程中断网是一样的,为了断点续传,在断网或者暂停的时候,我们要将目前的进度保存起来,以便下次上传时略过前面已置finish的片。

9.单例模式里面的异步操作使用过吗?

我只知道单例在创建的时候可以使用GCD的写法。

```

+(MyClass*) sharedInstance

    {

        static  MyClass *_sharedMyClass;

        static dispatch_once_t token;

        dispatch_once(&token,^{ _sharedMyClass = [[MyClass alloc] initWith:something];} );

        return _sharedMyClass;

    }

```

这样写的原因:

1.dispatch_once这个函数,它可以保证整个应用程序生命周期中某段代码只被执行一次!

2.线程安全。

什么是线程安全?

答:多线程操作共享数据不会出现想不到的结果就是线程安全的,否则,是线程不安全的。

到最后我也没答出来几个,没想到一个小公司问的问题和大厂的难度差不多了,关键是待遇也达不到大厂的水平,我要是都能答出来就不会来他们这面试了。两个人像审犯人一样,感觉他们比我还紧张。想找一个前端后台iOS都会的人,我确实达不到他们的要求。最后可能感觉到双方都不太满意,面试很快结束了,不管怎么样还是很感谢这次面试机会,让我弥补了很多平时遗漏的知识点,对以后的面试很有帮助。

推荐阅读更多精彩内容