1、除了使用 UIWebView 和 H5 进行交互,有没有尝试或者研究 WKWebView 与 H5 的交互,使用过程中会遇到什么问题?
2、简单介绍一下 Runtime
3、可以在运行时给类添加成员变量吗?为什么不能?(为什么成员变量列表设计成只读的,出于什么考虑?)
4、我们都知道在分类里可以添加方法,那么能否在分类中添加成员变量?为什么?
可以,通用Runtime重写成员变量的set和get方法
5、多线程开发时使用 NSOperation 比 GCD 的优势在哪里?
6、NSOperation 有哪几种状态?
7、在使用 NSOperationQueue 的时候,如何获取队列中 NSOperation 的状态?
8、给类添加属性时使用 atomic 有什么作用?它能否保证线程安全
确保属性四原子属性,不能保证线程安全
9、在对类簇进行方法交换的时候,需要注意哪些问题
10、深拷贝和浅拷贝
深拷贝相当于开辟新的内存地址,将内容复制过来;浅拷贝是把对象的指针指向该内存地址
+load 方法执行在 main 函数之前还是之后?
+load在main之前执行
11、父类、子类、子类的 Category 中 +load 方法按照什么顺序调用?
执行顺序: 父类-->子类-->子类的Category
12、说一下 KVO,使用 KVC 的方式赋值会不会触发 KVO?
根据KVO的实现原理,是在运行时生成新的子类并重写其setter方法,在其内容发生改变时发送消息。但这只是对属性直接进行赋值会触发,如果属性是容器对象,对容器对象进行add或remove操作,则不会调用KVO的方法。可以通过KVC对应的API来配合使用,使容器对象内部发生改变时也能触发KVO。
在进行容器对象操作时,先调用下面方法通过key或者keyPath获取集合对象,然后再对容器对象进行add或remove等操作时,就会触发KVO的消息通知了。
key方法:
- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key;
- (NSMutableOrderedSet *)mutableOrderedSetValueForKey:(NSString *)key API_AVAILABLE(macos(10.7), ios(5.0), watchos(2.0), tvos(9.0));
- (NSMutableSet *)mutableSetValueForKey:(NSString *)key;
-
keyPath方法:
- (NSMutableArray *)mutableArrayValueForKeyPath:(NSString *)keyPath;
- (NSMutableOrderedSet *)mutableOrderedSetValueForKeyPath:(NSString *)keyPath API_AVAILABLE(macos(10.7), ios(5.0), watchos(2.0), tvos(9.0));
- (NSMutableSet *)mutableSetValueForKeyPath:(NSString *)keyPath;
13、项目中做了哪些性能方面的优化
14、MVC 和 MVVM
15、MVVM 中用到的 RAC 中,热信号和冷信号
16、组件化的时候同层级模块间如何通信及调用
17、组件化的时候使用 CTMediator 方案有什么弊端?
18、有没有了解过使用其他的方式进行模块间通信?比如 URL 这种方式,简单介绍一下
19、介绍 UIViewController 的生命周期
20、事件传递链和事件响应链
事件的传递是从上到下(父控件到子控件),事件的响应是从下到上(顺着响应者链条向上传递:子控件到父控件。
21、利用 GCD 实现异步线程任务 A 和 B 执行完成后执行任务 C
22、使用 - performSelector:afterDelay: 方法的时候,需要注意什么问题
23、二叉树的遍历
24、如何从二叉树中快速查找到第二大的数
25、SDWebImage 中用到的缓存策略,如何做到最少使用的最先被清理出缓存?
26、如何设计一个读写锁