以下面试题大多是网上搜寻下来和自己面试中遇到过的,特地收集起来做个总结!答案不一定准确!还请读者自己斟酌。

Q : Category(类别) 和 Extention(扩展) 的不同

Category(类别)

  • 类别主要用于扩展方法,并且适用于SubClass(子类)
  • 但只能添加readonly(只读)属性,如果要添加readwrite(只写)属性必须在runtime过程中用objc_setAssociatedObject()和objc_getAssociatedObject()方法来实现属性的get与set方法;

Extention(扩展)

  • 和类别相同,同样可以扩展方法和属性,但局限于原始类
  • 且声明方法必须写在@implemention中实现(不然会报Warining)
  • Extention可以定义属性的读写

综上:要封装一些公共方法可以考虑使用Category(例如很多开源库大多方法都使用的Category),如果说是自己想添加一些私有方法和属性的时候,可以考虑Extention.

 

Q : 怎样理解 Protocol

A : 协议就是“功能的集合”或者说是"方法的集合",也就是"能力清单",综合来说协议就是带名字的能力清单(一般协议是和代理一起使用的)

 

Q : 什么是KVC和KVO?两者之间有何关系?

  • KVC : 键值编码,是Key Value Coding 的简称,cocoa的标准组成部分,是一种可以直接通过字符串的名字(Key)来访问类属性的机制,而不是通过调用Setter方法、Getter方法进行访问。
  • KVC优点1.主要的好处就是减少代码量;2.没有property的变量(即:私有变量private)也能通过KVC进行设置。

    KVC缺点如果key只写错,编写的时候不会报错,但是运行的时候会报错;

  • KVO : 键值监听,是Key Value ObserVing 的简称,当指定对象的属性被修改之后,允许对象接收到通知的机制。
  • 只有当我们调用KVC去访问key值的时候KVO才会起作用

Q : NSNotification 是什么?

  • 一个消息通知机制,类似广播。观察者只需要向消息中心注册感兴趣的东西,当有地方发出这个消息的时候,通知中心会发送给注册这个消息的对象。
  • 只要往NSNotificationCenter注册了,就必须有remove的存在

Q : NSNotification与KVO的区别是什么?什么时候应该使用 NSNotification? 什么时候应该使用 KVO?

  • KVO只能检测类中的属性,并且属性名都是通过NSString来查找,编译器不会帮你检错和补全,纯手敲所以比较容易出错。
  • KVO被观察者发出 addObserver:forKeyPath:options:context: 方法来添加观察者。
  • 通知不是由被观察者发出,而是由NSNotificationCenter来统一发出,而不同通知通过唯一的通知标识名notificationName来区分,标识名由发送通知的类来起。
  • NSNotification的特点呢,就是需要被观察者先主动发出通知,然后观察者注册监听后再来进行响应,比KVO多了发送通知的一步,但是其优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用也更灵活。