1.C和 OC 如何混编
xcode可以识别一下几种扩展名文件:
- .m文件,可以编写 OC语言 和 C 语言代码
- .cpp: 只能识别C++ 或者C语言(C++兼容C)
- .mm: 主要用于混编 C++和OC代码,可以同时识别OC,C,C++代码
2. Swift 和OC 如何调用?
- Swift 调用 OC代码
需要创建一个Target-BriBridging-Header.h
的桥文件,在乔文件导入需要调用的OC代码头文件即可 - OC 调用 Swift代码
直接导入Target-Swift.h
文件即可, Swift如果需要被OC调用,需要使用@objc 对方法或者属性进行修饰
3. Foundation 对象与 CoreFoundation 对象 有什么区别?
Foundation
对象是OC的,在MRC下需要手动管理内存,ARC下不需要手动管理Core Foundation
对象是C对象, MRC和ARC都需要手动管理内存- 数据类型之间的转换
-
- ARC:__bridge_retained, __bridge_transfer(自动内存管理)
- 非ARC: __bridge
4.与OC比较.Swift有什么优点?
Swift 是一门新型语言,借鉴了JS,Python,C#,Ruby
等语言特性,看上去偏脚本化,Swift 仍支持 cocoa touch
框架
优点:
- Swift更加安全,它是类型安全的语言。
- Swift容易阅读,语法和文件结构简易化。
- Swift更易于维护,文件分离后结构更清晰。
- Swift代码更少,简洁的语法,可以省去大量冗余代码
- Swift速度更快,运算性能更高。
5. delegate(代理,委托)
委托是协议的一种,顾名思义,就是委托他人帮自己去做什么事。
delegate:
- 非常严格的语法。所有将听到的事件必须是在delegate协议中有清晰的定义,语法清晰,易读;
- 如果delegate中的一个方法没有实现那么就会出现编译警告/错误
- 在释放代理对象时,需要小心的将delegate改为nil。一旦设定失败,那么调用释放对象的方法将会出现内存crash
6.Notification(通知)
在IOS应用开发中有一个”Notification Center“
的概念。它是一个单例对象,允许当事件发生时通知一些对象。
notification:
- 对于一个发出的通知,多个对象能够做出反应,即1对多的方式实现简单
- controller能够传递context对象(dictionary),context对象携带了关于发送通知的自定义的信息
- 在调试的时候应用的工作以及控制过程难跟踪;
7.KVO
KVO是一个对象能够观察另外一个对象的属性的值,并且能够发现值的变化。
KVO:
- 能够提供一种简单的方法实现两个对象间的同步。例如:model和view之间同步;
- 能够对非我们创建的对象,即内部对象的状态改变作出响应,而且不需要改变内部对象(SKD对象)的实现;
8. 如何选择delegate、notification、KVO?
三种模式都是一个对象传递事件给另外一个对象,并且不要他们有耦合。
- delegate. 一对一
- notification 一对多,多对多
- KVO 一对一
三者各有自己的特点:
- delegate 语法简洁,方便阅读,易于调试
- notification 灵活多变,可以跨越多个类之间进行使用
- KVO 实现属性监听,实现model和view同步
- 可以根据实际开发遇到的场景来使用不同的方式
9. 若你去设计一个通知中心,你会怎样设计?
个人理解: 参考现有的通知中心
- 创建通知中心单例类,并在里面有个一个保存通知的全局NSDiction
- 对于注册通知的类,将其注册通知名作为key, 执行的方法和类,以及一些参数做为一个数组为值
- 发送通知可以调用通知中心,通过字典key(通知名),找到对应的 类和方法进行执行调用传值.
10. Notification 和KVO区别
- KVO提供一种机制,当指定的被观察的对像的属性被修改后,KVO会自动通知响应的观察者,KVC(键值编码)是KVO的基础
- 通知:是一种广播机制,在实践发生的时候,通过通知中心对象,一个对象能够为所有关心这个时间发生的对象发送消息,两者都是观察者模式,不同在于KVO是被观察者直接发送消息给观察者,是对象间的直接交互,通知则是两者都和通知中心对象交互,对象之间不知道彼此
- 本质区别,底层原理不一样.kvo 基于 runtime, 通知则是有个通知中心来进行通知
11.结构体与数组有什么区别?
- 结构体可以存不同类型的元素,而数组只能存同一类型
- 结构体类型需要我们自已定义.数组是用别的类型加[元素个数]
- 结构体内存分配方式很特别,使用对齐原则,不一定是所有元素的字节数和,而数组一定是所有元素的字节数和.
- 结构体指针可以指针名->结构体元素名(取元素);数组不行.
12. NSDictionary的实现原理是什么?
- 哈希表(NSDictionary 是通过hash表来实现key和value之间的映射和存储的)
13.说一下静态库和动态库之间的区别
- 静态库:以.a 和 .framework为文件后缀名。
- 动态库:以.tbd(之前叫.dylib) 和 .framework 为文件后缀名。
- 静态库:链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝。
- 动态库:链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用(如系统的UIKit.framework等),节省内存。
- // 静态库.a 和 framework区别.a 主要是二进制文件,不包含资源,需要自己添加头文件
.framework 可以包含头文件+资源信息
14.对于 oc 来讲,他的最大优缺点是什么? 如何缺点如何绕过这些不足
优点:
- OC是C语言的超集, 在C语言基础上增加了面向对象特性, 开发使用起来会方便高效.
- 分类可以快速扩展类的方法.扩展模块之间相互不影响
- 运行时特性,动态特性(动态类型,动态绑定,动态加载),提高了编程的灵活性
- OC可以与C / C++进行混编
缺点:
- 不支持多继承,多继承可以使用分类,协议,消息转发来弥补
- 不支持运算符重载
- 使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到,如内联函数等,性能低劣。
- 执行效率比C低,语法怪异
15. OC与 JS交互方式有哪些?
16. 通过JS调用OC代码(url拦截)一
17. JS调用OC代码(messageHander)二
18 JS调用OC代码(WebViewJavascriptBridge)三
19.OC调用JS代码
20. 遇到过BAD_ACCESS的错误吗?你是怎样调试的?
21.什么是函数式编程?链式
22. 响应式编程?
23.Block和Protocol的区别,Block是为了解决什么问题而使用的。
24.说一下ios代码签名
25.什么是app thinning(app 瘦身)
26. 如果没有instruments,该如何检测memory leak, zombie object 之类的问题。
27.字典的工作原理 ?怎100w个中是怎么快速去取value?
28. isEquel和hash的关系
29.isEquel 和 isEquelToString
30. iOS 9 以后通知不再需要手动移除
31. 如何对 NSMutableArray 进行 KVO
32. 编译过程做了哪些事情;
33. 容错处理你们一般是注意哪些?
34. 项目开始容错处理没做?如何防止拦截潜在的崩溃?
35.@try @catch异常机制
36.单元测试是什么?
37. 一个上线的项目,知道这个方法可能会出问题,在不破坏改方法前提下,怎么搞?
38.Xcode编译器发展简史
39.代码从 Git 上拉下来到生成 .ipa 都有哪些过程,期间都生成了什么文件。
40.Pods的原理
41. 函数指针和 Block区别
42. 符号表
43. 应用瘦身(Thinning)
44.埋点处理
45.说一下iOS 中的APNS,远程推送原理?
如果你正在面试,或者正准备跳槽,不妨看看我精心总结的面试资料: BAT 大厂最新面试题+答案合集(持续更新中) 来获取一份详细的大厂面试资料 为你的跳槽加薪多一份保障。