(iOS面试资料大全)
1、简述你项目中常用的设计模式。它们有什么优缺点?
常用的设计模式有:代理、观察者、单例。
(1)单例:它是用来限制一个类只能创建一个对象。这个对象中的属性可以存储全局共享的数据。所有的类都能访问、设置此单例中的属性数据。
优点:是它只会创建一个对象容易供外界访问,节约性能。
缺点:是一个类只有一个对象,可能造成责任过重,在一定程度上违背了“单一职责原则”。单例模式中没有抽象层,所以单例类的扩展有很大的困难。不能过多创建单例,因为单例从创建到程序关闭前会一直存在,过多的单例会影响性能,浪费系统资源。
(2)观察者(KVO):它提供了观察某一属性变化的方法。当指定对象的属性发生改变后,它会自动通知相应的观察者。
优点:能提供被观察者属性的新值与旧值。用keypaths来观察属性,因此也可以观察嵌套对象。
缺点:需要注册观察者,实现observeValueForKeyPath:方法,属性可以通过KVC的方法来修改。否则观察者收不到通知。
(3)代理:可以实现类与类之间一对一的通信。
优点:代理协议方法都有清晰的定义。代理方法可以设置可选或必须实现。
缺点:需要定义协议方法,需要设置代理对象,代理对象实现协议方法。内存管理方面,需要注意循环引用问题。
2、代理模式能否实现一对多的通信?
可以,采用多播委托的方式来实现。多播委托:它是指允许创建方法的调用列表或者链表的能力。当多播委托被调用时,列表中的方法均自动执行。
普通代理只能是一对一的回调,无法做到一对多的回调,而多播委托正式对delegate的一种扩展与延伸,多了一个注册和取消的过程。任何需要回调的对象都必须先注册。
3、 重复注册通知会有问题吗?
不会出现问题,若多次发送同一通知,对方就会多次响应。如果重复注册通知,也会有多次响应的效果。为了避免重复注册通知而造成的错误,建议每次注册一个通知前,可以移除一次该通知。
4、项目中是否用过多线程编程?简述你常用的多线程实现方式?
常用的是GCD。
GCD是苹果开发中一个多核编程的解决方案。GCD的队列分为两种类型,SerialDispatchQueue与ConcurrentDispatchQueue。系统默认提供了一个dispatch_get_main_queue,一个dispatch_get_global_queue。
5、简述NSOperationQueue与GCD的区别。
(1) GCD是底层的C语言构成的API。NSOperationQueue及相关对象是Objc对象。在GCD中,在队列中执行的是由block构成的任务,这是一个轻量级的数据结构。而Operation作为一个对象,为我们提供了更多的选择。
(2) 在NSOperationQueue中,我们可以取消任务,而GCD没法停止已经加入queue的block。
(3) NSOperation能够方便的设置依赖关系。还能设置NSOperation的priority优先级,能够使同一个并行队列中的任务区分先后地执行。在GCD中,我们只能区分不同任务队列的优先级,如果要区分block任务优先级也需要大量复杂代码。
NSOperation还可以设置并发数。
6、实现多线程有哪几种方式?
(1)NSThread:detachNewThreadSelector:
(2)继承NSOperation
(3)GCD:dispatch_async
(4)NSObject:performSelectorInBackground:
7、KVC、KVO是什么?简述KVO的实现原理。KVO能否监听数组?如何实现?
KVC:键值编码,它是一种间接访问对象实例变量机制,可以不通过存取方法访问对象的实例变量。
KVO:键值观察,它可以使对象获取其他对象属性变化的通