2018.4月份iOS面试经历

1、关于面试机会

因为种种缘由,4月中本人毅然离开了上一家公司,紧接着开始投入到所谓的“3金4银”的就业求职黄金期中。html

通过本身一番筛选后,前先后后四天总共面了10家左右。截止目前,已定offer一个,主动拒绝一个。固然,本来还有两家也是颇有但愿拿offer的,由于本人不肯意接受“9106”的上班模式或拒绝提供薪资银行流水,而后就没有而后了。面试

就我的面试经从来看,深圳iOS行业面试机会仍是比较多的,其中还不乏有些公司主动找上门的。在技术面要求上,不一样规模的公司各有差别,大公司除了关注iOS基础,也很是注重算法及数据结构。算法

因为本人非计算机科班出身,每逢算法必输……算法显得尤其重要,只有发愤图强了。swift

据我的面试经历及观察,OC还是iOS开发的主流,基本上没遇到明确使用Swift开发的项目。固然我的仍是比较看Swift的,正在Swift道路上努力中……数组

最近还遇到比较怪的事情,HR在电话预定面试的时候居然还会先来个iOS基础快问快答环节,真是。。。因吹丝挺。。。。性能优化

扯远了,写文本的目的是为了分享一下这几天在面试中遇到感受比较有价值的笔试题和面试题。bash

2、笔试、面试题

1.算法题

(1).请在1000万个整型数据中以最快的速度找出其中最大的1000个数?

这是一个常常被问到的问题,百度网上解法也不少。数据结构

这里仅提供基本思路,供参考:把1000万的整型平均分到合适n个文件中,分别对每一份文件找出前1000个最大的数,最后对每份文件前1000数据用常规算法合并便可。函数

那么,如何从每一份文件中找出前1000个最大的数呢?工具

先取文件中前1000个数放到数组中,并排好序(假设升序),以后从文件中读取下一个数与数组第一个数比较,若是比数组中第一个数大,则替换数组第一个数,并从新排序,以后再取下一个数进行下轮比较便可。

(2) .循环链表题:一个有序循的整形环链表断开了,请插入一个整形数,使得链表仍然是有序的。

解题思路:请百度……哈哈。

2. OC题

(1).Block中能够修改全局变量,全局静态变量,局部静态变量吗?

答案,能够。 缘由请参考深刻研究Block捕获外部变量和__block实现原理

(2)代码分析题,如下代码输出结果是什么?

@property (nonatomic, strong) NSString *strongString;
@property (nonatomic, weak)   NSString *weakString;

strongString =  [NSString stringWithFormat:@"%@",@"string1"];
weakString =  strongString;
strongString = nil;

NSLog(@"%@", weakString);
复制代码

答案: string1,缘由:@"string1" 初始化 retainCount == 1; strongString 指向@"string1"对象, retainCount +1,strongString = nil, retainCount -1,最后retainCount == 1,因此输出是string1。

抱歉,此题以前给的方向有误。

感谢@Mr_Wei,@毵毵肆肆 iOS 两位大佬提供的解题思路。 答案输出结果仍然是string1,具体请参考两位大佬的评论,谢谢。

(3)SDWebImage实现原理是什么? 它是如何解决tableView的复用时出现图片错乱问题的呢?

答案:原理请参考iOS开发之SDWebImage原理,解决tableView复用错乱问题:每次都会调UIImageView+WebCache文件中的 [self sd_cancelCurrentImageLoad];

(4)iOS事件响应链机制是什么?

答案:iOS 事件响应链

(5)如图view上有横向排列label1 和 label2, label1,label2间距固定,内容动态变化。 请使用AutoLayout创建约束,保证label2内容要彻底显示,label1内容自适应?

答案:请参考 iOS AutoLayout使用技巧

(5)对runtime和runloop了解吗?

5.1 runtime:又称运行时,是一套底层的C语言API。 runtime应用场景:

a.字典模型自动转化(MJExtension,YYModel)

b.系统方法交互(Swizzle黑魔法)

c.万能控制器跳转(经过推送传过来控制器名称,属性等)

d.给分类(category)添加属性(实现setter、getter方法)

e.实现自动归档和解归档(原理与a相似)

5.2 runloop: 从字面上讲就是一个运行循环,内部是do-while循环,在这个循环内部处理各类任务。 一个线程对应一个runloop,主线程的循环默认启动,子线程的runloop得手动启动(调用run方法)。 runloop只能选择一个Model启动,若是当前Model中没有任务Source(Source0, Source1)、Timer,那么就直接退出runloop. runloop的做用:保持程序持续运行,处理App中各类事件。经过runloop,有事情运行,没事休息,能够节省Cpu资源,提升程序性能。

runloop应用: a.

想更深刻了解runloop,请看大牛博客深刻理解RunLoop

或者看这个视频iOS线下分享《RunLoop》by 孙源@sunnyxx

3. Swift题

(1)struct 和 class 的区别?

答案:

区别:

a. 类能够继承,结构体不能够

b. 可让一个类的实例来反初始化,释放存储空间,结构体作不到

c. 类的对象是引用类型,而结构体是值类型。因此类的赋值是传递引用 ,结构体则是传值。

相同点:

a,类和结构体均可以扩展

b,定义属性用于储存值

c,定义方法用于提供功能

d,定义下标用于经过下标语法访问值

e,定义初始化器用于生成初始化值

(2)class与staitc关键字的区别?

a. static 能够在类、结构体、或者枚举中使用。而 class 只能在类中使用。

b. static 能够修饰存储属性,static 修饰的存储属性称为静态变量(常量)。而 class 不能修饰存储属性。

c. static 修饰的计算属性不能被重写。而 class 修饰的能够被重写。

d. static 修饰的静态方法不能被重写。而 class 修饰的类方法能够被重写。

e. class 修饰的计算属性被重写时,可使用 static 让其变为静态属性。 f. class 修饰的类方法被重写时,可使用 static 让方法变为静态方法。

(3)swift是如何解决循环引用问题的?

答案: 请参考:Unowned 仍是 Weak?生命周期和性能对比

4. 性能优化题

(1)了解App进行性能优化吗,影响App启动时间的因素有哪些?

答:1.1 App性能优化涉及方面不少。我的感受面试官主要想知道做为开发人员,对Instruments工具的了解及使用状况,关于 Instruments里面工具: Time Profiler: 性能分析

Zombies:僵尸对象检测

Allocations:内存检查

Leaks:内存泄露检测。

1.2 响应App启动时间的因素大致分为pre-main(执行App main函数前时间)和main(执行App main函数时间)两部分。 详细分析请参考[iOS]一次立竿见影的启动时间优化