主要知识点:递归循环引入
的问题
导入的文推荐格式,均可以导入 C/C++
头文件,#include
还能导入更多格式类似txt
导入的方式:#include
是将文件内容复制到指令处
导入文件的查找方式:#include
当前文件所处文件夹,再找不到就从当前文件夹的父文件夹查找,再不行就是往上推,再找不到就IDE设置的查找路径,再找不到就从系统环境变量配置的地址。
再讲讲"" && <> 的异同。
成员变量可以
手动触发的方式KVO
1
是基于端口的。0
是基于非端口的。可以将runloop
启动的过程讲一遍。
主要包含两个observer
, 监听runloop entry
状态,第二个observer
主要监听beforeWaiting
状态和 exit
状态。然后静候面试官的问题,看看想要更深入的了解哪部分的。
按照提问的顺序,面试官可能对RunLoop比较感兴趣,可以讲讲定时器,在runloop中是如何注册事件的。然后讲讲定时器tolerance
的问题,关于注册的事件,被一事件处理耽误过后并不会响应的问题。然后讲讲方案,丢到子线程中(主线程刷新UI),添加到RunLoop中。以及CADisplayer
方案原理需要储备。
这个问题可以先讨论,一般函数的调用顺序,一般函数调用的顺序其实主要考察了runtime的知识点,关于分类和主类合并的过程中使用的move
和copy
.就是说主类函数后移,分类放在前面。故此处的一般函调用顺序是分类被编译的先后顺序
。这里还有更深入的问题就是load
,initailize
的顺序。
先用一句话来概述RunLoop
是啥,RunLoop
与线程的对应关系。因为知识点比较庞大,我们可以等面试官来问一下他想知道的点。Jeverson
这里的想知道souce0,1
的事情。然后Jeverosn
讲了区别。然后又继续问了关于定时器在滑动过程为什么不工作的原因。Jeverson
讲了关于runloop``mode
切换的原因导致的。然后讲讲解决方案。
补充RunLoop的知识点还有很多,比如AFN2.x
的常驻线程,常驻线程的使用场景。事件响应过程
,渲染过程
,异步绘制
,子线程使用peformselector:delay:的问题
,NSTimer的问题
Flutter
, ReactNative
综述一下Flutter
和ReactNative
实现跨平台的方式,前者提供渲染引擎
和SDK
使用dart
驱动,后者是通过Jscore
和Jsbridge
与native
通信的。后面在讲描述组件结构结构树
,讲讲AST
中避免整个DOM
更新/销毁的 VirtualDOM
。讲了者玩意就会给你来点diff
的问题
ReactNative
中key
开发中使用啥来给他赋值,用数组的index会有啥问题VirturalDOM
和当前新DOM
需要使用diff
算法来比较结构树是否有变化,默认的key
值就是idex
。组件
具有唯一约束的属性id
, 取的就是key
值,当我们数组中对象的属性时
(不修改数据源顺序), diff
的时候就有问题,id
为 0
的节点,virtualDom
也存在,直接保留组件。但是这里的组件是要更新的!
Flutter
A push B, B pop A ,A widget 状态保持的问题AutomaticKeepAliveClientMixin
协议
拦截URl
, js注入
,这里呢主要还有个UIWebView
, 和WKWebView
两者前面方式不一样。描述一下即可。如果想再深入的交流WK
做了哪些优化。
ObjC
是一门动态语言
runtime
为其动态性提供支持,所有应用将会连接到runtime 这个库中
Person *p = [[Person alloc] init]; [p goodJob];
首先讲出来这是个消息机制
然后讲一下实际发消息在 runtime
中是objc_msgSend
, 然后讲讲p
对象是个receiver
, 然后讲讲p
对象是怎么找方法的. 也就是根据对象 isa
指针找到class
对象,从他的methodlist
中寻找,如果找不到会找到meta Class
对象寻找,再找不到就去root meta class
,然后再从NSObject
中找在找不到就进入消息转发阶段
。若三次转发还有没有,就直接unrecognizeMethod
.
这里考察的问题是: class_rw_t
, 和class_ro_t
, 方法列表
,属性列表
,协议列表
, 成员变量
,和ro
的指针。 这里还会问到ro
存放的是啥。
+方法
,存在哪里。寻找过程是怎么样的?这里考察的问题是meta class
讲述出来,类方法存在与meta class
中,方法找寻的过程是从meta class
的isa
指针的指向。
resolveInstanceMethod
或resolveClassMethod
methodSignatureForSelector
和forwardInvocation
NSInvocation
的数据结构也了解一下json
null 问题等。了解一下原理,以及timer 循环引用中使用,NSProxy;以及其中必须实现的方法。
block
是包含函数
和执行上下文的
的OC
对象
简述一下全局block
,栈block
,堆block
;以及描述一下ARC
中将栈block
copy
到堆block
的情况。有条件可以讲讲block
获取变量的方式:值截获
,地址截获
。
__block
修改局部变量的方式__block
修饰的局部变量,其实就是修改了Auto
变量的__forwarding
指向,指向在堆中变量
。这样block修改局部变量的时候,就能轻松的持有堆中的变量。
解决方式是断开一方的强引用。__weak
修饰。当然也可以使用unsafe_unretained
,后者有可能会出现野指针
的问题。
__weak
的原理简述一下weak
修饰符的使用场景。以及weak
的数据结构,哈希表。以及当weak
指针指向的对象被销毁的过程中,如何从HashTable
中移除weak
修饰的对象并滞空的。需要准备weak_store()
的过程,已经SideTable
的数据结构。
可变数组中,遍历删除的会有问题吗?,挖坑题,这种情况只会出现在数组增强for循环,非反转数组便利的删除过程
,会报错在便利过程中,修改
原数组的异常。
简述一下,KVO
其实就是让类接收属性变化通知
的过程。即生成NSOObserveringNotify_XXX
子类,isa_swizzling
将原对象的isa指针指向那个子类,重写set
方法,调用NSObject
,willChangeValueForKey
调用父类的set方法
,didChangeValueForKey
.
与上述问题重复,此处不再赘述
与上述问题重复,此处不再赘述
rw
, ro
, 都描述一下,主要包含属性列表
,协议列表
,成员变量
,方法列表
,描述一下ro
和rw
的区别,主要讲述一下ro
主要包含编译器期间的信息。可能会问到category
方法合并的问题,在什么时间合并,合并到哪里。讲述一下即可。
此处主要考察的是,元类中主要和类有啥区别,讲述一下类方法
存储在元类中。其他的结构和类相似。
与上面回答重复,此处不再赘述
autoreleasepool
的数据结构双向链表
。
NSThread + RunLoop
NSURLConnection
请求是异步的,请求返回需要在当前线程中等待。为了避免线程的开销,节省资源,故采用常驻线程的方式。
NSURLSession
NSOperationQueue对网络回调的管理,并且设置maxConcurrentOperationCount为1,保证了最大的并发数为1,也就是说让网络请求串行执行。避免了多线程环境下的资源抢夺问题。
SDWebImage
是一套封装良好的第三方库,分析源码能得到很大的启发。建议去浏览一下源码。配合源码去总结一下,这里指提供一些思路。
UIView+Category
, SDWebImageManager
, SDWebImageDownloader&&SDWebImageDownloaderOperation
以及SDImageCache,
SDWebImage
缓存策略,三级缓存内存缓存
,磁盘缓存
,网络缓存
API
的使用,SDWebImage
做了啥。