收藏本站
51Code Android开发培训Banner
您所在的位置:51Code首页 > 资料精选 > 学习资料 > 【学习资料】这些 iOS 面试基础题目,你都深入了解吗?

【学习资料】这些 iOS 面试基础题目,你都深入了解吗?

      发布时间:2016年01月24日 18:00分    来源:51Code采编    关键词:iOS面试         | 上一篇 | 下一篇 |


 

这些 iOS 面试基础题目你都深入了解吗01

 

这些 iOS 面试基础题目你都深入了解吗02

 

       说到面试,大家最先想到的是考官会给我们出一些什么样的iOS面试题呢?iOS职场专家说这些以下这些都是iOS 面试的基础问题,应该对此深入的了解。当初看到时,估计大部分人都回答不上来,因为平时没有好好思考整理过。这里大部分的概念大多会在学习 OC 的过程中遇到过,但还是得经过写代码才能有更深的理解。以下就是iOS开发者可能会用到的一些iOS面试基础题目,希望对大家有用。

 

       Objective-C 底层

 

       Objective-C runtime library:Objective-C 的对象模型 ,Block 的底层实现结构 ,消息发送,消息转发,category method 实现,class load。

       Runtime大家在平时很少涉及到,没有系统学习过,而且很多次看了不久就忘了,所以这里给出一些不错的文章的链接供参考。这几个问题在《iOS 7 Programming Pushing the Limits》都有过深入的解读。除此之外,iOS专家也讨论过前两者:

       Runtime大家在平时很少涉及到,没有系统学习过,而且很多次看了不久就忘了,所以这里给出一些不错的文章的链接供参考。这几个问题在《iOS 7 Programming Pushing the Limits》都有过深入的解读。除此之外,iOS专家也讨论过前两者:

 

       1.《Objective-C对象模型及应用》

 

这些 iOS 面试基础题目你都深入了解吗03

 

       那么就来看看 Session 404 Advanced in Objective-C ,从36分起讲相关的东西,iOS开发者可能看不太懂,那还是先看看这个吧。在《iOS 7 Programming Pushing the Limits》的 Further Reading : objc_explain_Non-pointer_isa 部分谈论了这个问题。

 

       2. 《谈 Objective-C Block 的实现》

       内容非常翔实,特别是关于 Block 类型的部分,强烈建议做下文章开头提到的测试:Objective-C Blocks Quiz。

 

       3. 消息发送和消息转发

        消息发送比较好理解,先了解下 runtime 吧,可以查看官方文档《Objective-C Runtime Guide》 。之前学习其他语言的时候还没有关注过调用函数的背后发生了什么,在 Objective-C 中,在对象上调用方法称为发送消息,比如 [ receiver message ] ; 这行代码,编译的时候编译器将之转换为对底层 C 函数objc_msg Send 的调用:objc _ msg Send ( receiver, selector);在运行时,调用哪个方法则完全由 runtime 决定,甚至在运行时可以替换调用的方法,这是Objective-C 被称为动态语言的根本原因。对于消息转发,大家现在看到的大部分博客都是说消息转发给了你补救措施来应对没有没有实现的方法防止 Crash 或者实现类似多继承的机制。那相信iOS面试者心中一定有个疑惑,干嘛不实现那个方法,而要在代价很大的转发机制里处理呢。在 《Effective Objective-C 2.0》 一书第 12 条 tip 中用 @dynamic 演示了实现动态方法解析的例子来说明消息转发的意义,其中也有对官方文档的中文翻译和一些注解。

 

       4. Implement of category and method

       《刨根问底Objective-C Runtime(3)- 消息 和 Category》 (文章原来的链接放进来跟简书的处理有冲突,这里给的是博客地址,而不是这篇文章的具体地址,不过很好找)。

 

       5. Class load

        可以看这篇博客 : 《Objective-C Class Loading and Initialization》 ,看了下作者的 Github,原来是以前的国外程 序员,看人家的 repo 和星星,质量有保障,再看博客文章列表,有很多深入底层的内容,一座宝矿啊。另外在 《Effective Objective-C 2.0 》 书中第51节 《 精简 initialize 与 load 的实现》 中也讨论了这个问题,当初看完一头雾水,看的多也就能看懂啦。

 

       Core Data: 大量数据多线程同步

 

       第一步:搭建 Core Data 多线程环境

 

       这个问题首先要解决的是搭建 Core Data 多线程环境。NS Managed Object Context 不是线程安全的,你不能随便地开启一个后台线程访问 managed object context 进行数据操作就管这叫支持多线程了 。Core Data 对多线程的支持比较好。NS Managed Object Context 在初始化时可以指定并发模式,有三种选项:

 

       1.NS Confinement Concurrency Type

       这种模式是用于向后兼容的,使用这种模式时你应该保证不能在其他线程使用 context,但这点很难保证,不推荐使用。此模式在 iOS 9中已经被废弃。

 

       2.NS Private Queue Concurrency Type

       在一个私有队列中创建并管理 context。

 

       3.NS Main Queue Concurrency Type

       其实这种模式与第2种模式比较相似,只不过 context 与主队列绑定,也因此与应用的 event loop 很亲密。当 context 与 UI 更新相关的话就使用这种模式。

 

       搭建多线程 Core Data 环境的方案一般是:创建一个 NS Main Queue Concurrency Type 的 context 用于响应 UI 事件,其他涉及大量数据操作可能会阻塞 UI 的就使用 NS Private Queue Concurrency Type 的 context。环境搭建好了,如何实现多线程操作?官方文档《Using a Private Queue to Support Concurrency》为我们做了示范。

       要在不同线程中使用 managed object context 时,不需要我们创建后台线程然后访问 managed object context 进行操作,而是交给 context 自身绑定的私有队列去处理,我们只需要在上述两个方法的 Block 中执行操作即可。而且,在 NS Main Queue Concurrency Type 的 context 中也应该使用这种方法执行操作,这样可以确保 context 本身在主线程中进行操作。