2020年面试:整理出一份高级iOS面试题

前言:应届/实习求职的学生,但凡有些iOS编码能力(熟悉Runtime原理、看过一些开源库实现、有一定项目经验等),在大厂的招聘市场上都会很有竞争力。如果期望应届毕业去大厂镀金的,建议可以考虑走iOS这条路线。如果是在不喜欢这条路,入职之后再转方向也是可以,至少你的起点是大厂了。

1、NSArray与NSSet的区别?

  • NSArray内存中存储地址连续,而NSSet不连续
  • NSSet效率高,内部使用hash查找;NSArray查找需要遍历
  • NSSet通过anyObject访问元素,NSArray通过下标访问

2、NSHashTable与NSMapTable?

  • NSHashTable是NSSet的通用版本,对元素弱引用,可变类型;可以在访问成员时copy
  • NSMapTable是NSDictionary的通用版本,对元素弱引用,可变类型;可以在访问成员时copy

(注:NSHashTable与NSSet的区别:NSHashTable可以通过option设置元素弱引用/copyin,只有可变类型。但是添加对象的时候NSHashTable耗费时间是NSSet的两倍。
NSMapTable与NSDictionary的区别:同上)

3、属性关键字assign、retain、weak、copy

  • assign:用于基本数据类型和结构体。如果修饰对象的话,当销毁时,属性值不会自动置nil,可能造成野指针。
  • weak:对象引用计数为0时,属性值也会自动置nil
  • retain:强引用类型,ARC下相当于strong,但block不能用retain修饰,因为等同于assign不安全。
  • strong:强引用类型,修饰block时相当于copy。

4、weak属性如何自动置nil的?

  • Runtime会对weak属性进行内存布局,构建hash表:以weak属性对象内存地址为key,weak属性值(weak自身地址)为value。当对象引用计数为0 dealloc时,会将weak属性值自动置nil。

5、Block的循环引用、内部修改外部变量、三种block

  • block强引用self,self强引用block
  • 内部修改外部变量:block不允许修改外部变量的值,这里的外部变量指的是栈中指针的内存地址。__block的作用是只要观察到变量被block使用,就将外部变量在栈中的内存地址放到堆中。
  • 三种block:NSGlobalBlack(全局)、NSStackBlock(栈block)、NSMallocBlock(堆block)

6、KVO底层实现原理?手动触发KVO?swift如何实现KVO?

  • KVO原理:当观察一个对象时,runtime会动态创建继承自该对象的类,并重写被观察对象的setter方法,重写的setter方法会负责在调用原setter方法前后通知所有观察对象值得更改,最后会把该对象的isa指针指向这个创建的子类,对象就变成子类的实例。
  • 如何手动触发KVO:在setter方法里,手动实现NSObject两个方法:willChangeValueForKey、didChangeValueForKey
  • swift的kvo:继承自NSObject的类,或者直接willset/didset实现。

7、categroy为什么不能添加属性?怎么实现添加?与Extension的区别?category覆盖原类方法?多个category调用顺序

  • Runtime初始化时categroy的内存布局已经确定,没有ivar,所以默认不能添加属性。
  • 使用runtime的关联对象,并重写setter和getter方法。
  • Extenstion编译期创建,可以添加成员变量ivar,一般用作隐藏类的信息。必须要有类的源码才可以添加,如NSString就不能创建Extension。
  • category方法会在runtime初始化的时候copy到原来前面,调用分类方法的时候直接返回,不再调用原类。如何保持原类也调用。
  • 多个category的调用顺序按照:Build Phases ->Complie Source 中的编译顺序。

8、load方法和initialize方法的异同。——主要说一下执行时间,各自用途,没实现子类的方法会不会调用父类的?
load initialize 调用时机 app启动后,runtime初始化的时候 第一个方法调用前调用 调用顺序 父类->本类->分类 父类->本类(如果有分类直接调用分类,本类不会调用) 没实现子类的方法会不会调用父类的 否 是 是否沿用父类实现 否 是

9、对 runtime 的理解。——主要是方法调用时如何查找缓存,如何找到方法,找不到方法时怎么转发,对象的内存布局

OC中向对象发送消息时,runtime会根据对象的isa指针找到对象所属的类,然后在该类的方法列表和父类的方法列表中寻找方法执行。如果在最顶层父类中没找到方法执行,就会进行消息转发:Method resoution(实现方法)、fast forwarding(转发给其他对象)、normal forwarding(完整消息转发。可以转发给多个对象)

10、runtime 中,SEL和IMP的区别?

每个类对象都有一个方法列表,方法列表存储方法名、方法实现、参数类型,SEL是方法名(编号),IMP指向方法实现的首地址

11、autoreleasepool的原理和使用场景?

  • 若干个autoreleasepoolpage组成的双向链表的栈结构,objc_autoreleasepoolpush、objc_autoreleasepoolpop、objc_autorelease
  • 使用场景:多次创建临时变量导致内存上涨时,需要延迟释放
  • autoreleasepoolpage的内存结构:4k存储大小

[图片上传失败...(image-46e4fe-1606890615062)]

12、Autorelase对象什么时候释放

在没有手加Autorelease Pool的情况下,Autorelease对象是在当前的runloop迭代结束时释放的,而它能够释放的原因是系统在每个runloop迭代中都加入了自动释放池Push和Pop。

13、Runloop与线程的关系?Runloop的mode? Runloop的作用?内部机制?

  • 每一个线程都有一个runloop,主线程的runloop默认启动。
  • mode:主要用来指定事件在运行时循环的优先级
  • 作用:保持程序的持续运行、随时处理各种事件、节省cpu资源(没事件休息释放资源)、渲染屏幕UI

14、iOS中使用的锁、死锁的发生与避免

  • @synchronized、信号量、NSLock等
  • 死锁:多个线程同时访问同一资源,造成循环等待。GCD使用异步线程、并行队列

15、NSOperation和GCD的区别

  • GCD底层使用C语言编写高效、NSOperation是对GCD的面向对象的封装。对于特殊需求,如取消任务、设置任务优先级、任务状态监听,NSOperation使用起来更加方便。
  • NSOperation可以设置依赖关系,而GCD只能通过dispatch_barrier_async实现
  • NSOperation可以通过KVO观察当前operation执行状态(执行/取消)
  • NSOperation可以设置自身优先级(queuePriority)。GCD只能设置队列优先级(DISPATCH_QUEUE_PRIORITY_DEFAULT),无法在执行的block中设置优先级
  • NSOperation可以自定义operation如NSInvationOperation/NSBlockOperation,而GCD执行任务可以自定义封装但没有那么高的代码复用度
  • GCD高效,NSOperation开销相对高

16、oc与js交互

  • 拦截url
  • JavaScriptCore(只适用于UIWebView)
  • WKScriptMessageHandler(只适用于WKWebView)
  • WebViewJavaScriptBridge(第三方框架)

17、swift相比OC有什么优势?

18、struct、Class的区别

  • class可以继承,struct不可以
  • class是引用类型,struct是值类型
  • struct在function里修改property时需要mutating关键字修饰

19、访问控制关键字(public、open、private、filePrivate、internal)

  • public与open:public在module内部中,class和func都可以被访问/重载/继承,外部只能访问;而open都可以
  • private与filePrivate:private修饰class/func,表示只能在当前class源文件/func内部使用,外部不可以被继承和访问;而filePrivate表示只能在当前swift源文件内访问
  • internal:在整个模块或者app内都可以访问,默认访问级别,可写可不写

20、OC与Swift混编

  • OC调用swift:import "工程名-swift.h” @objc
  • swift调用oc:桥接文件

21、map、filter、reduce?map与flapmap的区别?

  • map:数组中每个元素都经过某个方法转换,最后返回新的数组(xx.map({0 *0}))
  • flatmap:同map类似,区别在flatmap返回的数组不存在nil,并且会把optional解包;而且还可以把嵌套的数组打开变成一个([[1,2],[2,3,4],[5,6]] ->[1,2,2,3,4,5,6])
  • filter:用户筛选元素(xxx.filter({$0 > 25}),筛选出大于25的元素组成新数组)
  • reduce:把数组元素组合计算为一个值,并接收初始值()

[图片上传失败...(image-3a3a3b-1606890615062)]

22、guard与defer

  • guard用于提前处理错误数据,else退出程序,提高代码可读性
  • defer延迟执行,回收资源。多个defer反序执行,嵌套defer先执行外层,后执行内层

23、try、try?与try!

  • try:手动捕捉异常
  • try?:系统帮我们处理,出现异常返回nil;没有异常返回对应的对象
  • try!:直接告诉系统,该方法没有异常。如果出现异常程序会crash

24、@autoclosure:把一个表达式自动封装成闭包

25、throws与rethrows:throws另一个throws时,将前者改为rethrows

26、App启动优化策略?main函数执行前后怎么优化

  • 启动时间 = pre-main耗时+main耗时
  • pre-main阶段优化:
  • 删除无用代码
  • 抽象重复代码
  • +load方法做的事情延迟到initialize中,或者+load的事情不宜花费太多时间
  • 减少不必要的framework,或者优化已有framework
  • Main阶段优化
  • didFinishLauchingwithOptions里代码延后执行
  • 首次启动渲染的页面优化

27、crash防护?

  • unrecognized selector crash
  • KVO crash
  • NSNotification crash
  • NSTimer crash
  • Container crash(数组越界,插nil等)
  • NSString crash (字符串操作的crash)
  • Bad Access crash (野指针)
  • UI not on Main Thread Crash (非主线程刷UI (机制待改善))

28、内存泄露问题?

主要集中在循环引用问题中,如block、NSTime、perform selector引用计数问题。

29、UI卡顿优化?

30、架构&设计模式

  • MVC设计模式介绍
  • MVVM介绍、MVC与MVVM的区别?
  • ReactiveCocoa的热信号与冷信号
  • 缓存架构设计LRU方案
  • SDWebImage源码,如何实现解码
  • AFNetWorking源码分析
  • 组件化的实施,中间件的设计
  • 哈希表的实现原理?如何解决冲突

31、数据结构&算法

  • 快速排序、归并排序
  • 二维数组查找(每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数)
  • 二叉树的遍历:判断二叉树的层数
  • 单链表判断环

32、计算机基础

  1. http与https?socket编程?tcp、udp?get与post?
  2. tcp三次握手与四次握手
  3. 进程与线程的区别

作者:Tom Werner
链接:https://zhuanlan.zhihu.com/p/77789398

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容