一、系统的UI事件传递机制是怎样的?
哪一个视图响应
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
点击区域是否在这个视图内
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
二、KVO的实现原理是怎样的?
- 观察者设计模式
-
isa-swizzling
三、简单说说消息传递机制和消息转发流程?
缓存是否命中:hash查找
当前类中查找:已排序二分查找、未排序一般遍历查找
逐级父类查找:缓存是否命中、方法列表中
runtime
四、当一个obj废弃的时候,指向它的weak指针为何会自动置为nil?
Runtime维护了一个Weak表,用于存储指向某个对象的所有Weak指针。Weak表其实是一个哈希表,Key是所指对象的地址,Value是Weak指针的地址(这个地址的值是所指对象的地址)的数组。
在对象被回收的时候,经过层层调用,会最终触发下面的方法将所有Weak指针的值设为nil
OC内存管理
五、Block的实质是怎样的?使用Block为何容易产生循环引用?
将函数及其执行上下文封装起来的对象。
在 ARC 下,当 block 获取到外部变量时,由于编译器无法预测获取到的变量何时会被突然释放,为了保证程序能够正确运行,让 block 持有获取到的变量,向系统显明:我要用它,你们千万别把它回收了!然而,也正因 block 持有了变量,容易导致变量和 block 的循环引用,造成内存泄露!
Block相关
六、简单说说怎样用GCD实现高效的多读单写逻辑?
dispatch_barrier_async
首先栈栏函数的作用,是执行到当前位置,前面的全部任务都要等待,等待block内部任务执行完成后,继续执行其他任务
多线程
七、RunLoop为何能做到有事做事,没事休息?
1、RunLoop是一个通过内部循环对事件/消息进行管理的一个对象。
2、程序运行会调用main函数,在main函数里面调用UIApplicationMain,UIApplicationMain函数会启动主线程的runloop。
3、runloop运行后,会调用系统方法mach_msg(),会使得程序从用户态变成核心态,此时线程处于休眠状态。
4、当有外界条件变化(Source/Timer/Observer),mach_msg会使得程序从核心态变成用户态,此时线程处于活跃状态。
八、怎样解决DNS劫持?
网络相关
九、分别说说什么是桥接模式、责任链模式?
连接,自己拥有自己
十、怎样设计一个图片缓存框架?
架构
十一、请编写查找一个字符串中,第一个只出现一次的字符的算法 ?
哈希查找
十二、AFNetworking大致是怎样实现的?
第三方框架