iOS 面试总结 - 2019

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、如何设计一个读写锁

猜你喜欢

转载自blog.csdn.net/qq_31709953/article/details/98602786