在Objective-C中的私有的实质是它不告诉你私有的东西在哪,你可以自己找。找着了就找着了,没找着就没找着。
你可以借助运行时机制来捕捉私有成员。
而其他面向对象编程语言就是如果你找到了它的私有成员,它会显示地报错提示这是错误的。
键值对:是把属性名称字符串作为key,把属性对应的值作为value。
KVC:(Key-Value Coding)键值对编码,它遵循了非正式协议NSKeyValueCoding协议,它无需调用对象的存取方法。
KVC的实现原理是基于isa-swizzling,即,类型混合指针机制,技术实现的,KVC用它来查找定位。
isa指向了一个对象的类,这个类其实是个类对象。
类对象里面有一个方法的调度表,它是由类对象的指向类对象方法的指针组成的。
此外类对象还有一个指向父类的指针。
有这几样东西就可以组成类的层次结构了。
isa指针是很关键的,尤其是对于消息分发机制和Cocoa对象的动态能力。
KVO:(Key-Value Observer),它遵循了NSKeyValueObserving的非正式协议,它不仅适用于NSObject还适用于NSSet和NSArray。
既然是观察者肯定是有注册和解除的操作的。
手动和自动KVO通知
默认是自动的。
手动的过程就是你自己控制原本自动过程来完成的那些工作,所以还是自动的好,我觉得除非你手动过程和自动过程有区别才行。
Key-Value Binding键值对绑定,其实就是注册观察者和获取被观察者变更通知的过程。
要想使用KVB,你需要做2个如下工作:
1、对于1对1的观察,需要实现存取器。
2、对于1对多的观察,就是你观察的属性可能是个集合,那这需要分成好几种情况。
- 如果该属性是一个集合或者它返回一个集合,那么getter需要被命名为属性名。
- 如果属性是可以改变的,并且getter方法并不返回一个可变集合,insertObject、inKeyAtIndex、removeObjectFromKeyAtIndex。
- 如果实例变量不是集合类型,且getter不返回集合,则必须实现其他的NSKeyValueCoding方法。
对于自动KVO而言,你只要满足KVC,就能KVO了。
对于手动KVO而言,那你就需要做一些额外的工作了。