"单利模式":在程序的运行过程中,允许在程序的任何一个地方用同一种方法获取同一个对象(实例)的方式。
单利的作用:可以保证在程序运行过程中,一个类只有一个实例,而且该实例方便外界访问。控制了实例的个数,节约系统资源。
单利的应用场景:在整个应用程序中,共享一份资源,这份资源只需要创建初始化一次就行,比如登陆的控制器。
单利的设计:1,提供一个类方法供外界方便获取这个类的单利对象。注意:命名要规范,share / share +类名,default/default+类名。
2,提供一个静态变量,用来保存当前类唯一的一个实例对象。
3,+ alloc方法在内部会调用一个allocWithZone:方法(分配内存),也就是说在外界通过alloc init方法创建该类的实例的时候会调用这个方法,然后重写这个方法。在这个方法里面使用静态的一次性函数
/*
static dispatch_once_t oncetoken;
dispatch_once (&onceToken, ^{
_instance = [super allocWithZone:zone];
});
*/
在一次性函数里调用[superallocWithZone:zone]并对静态的变量赋值这时这个静态变量保存了给当前类的实例对象分配的内存空间。并在重写的这个方法最后返回这个静态变量,保证了只分配一块内存。
4,实现第一步的那个类方法。返回[[selfalloc] init];
5,严谨起见,重写copyWithZone:和mutableCopyWithZone:方法,返回那个静态变量。
KVO
KVO实现原理:
1,KVO是基于runtime机制实现的。
2,当某个类的属性对象第一次被观察时,系统就会在运行时动态的创建一个该类的派生类,在这个派生类中重写基类中任何被观察的属性的setter方法,派生类在被重写的setter方法内部实现真正的通知机制。
3,如果原来的类名为Person ,那么生成的派生类名为NSKVONotifying_Person,(就是在原类类名的基础上,在前面加NSKVONotifying_).
4,每个类的对象都有一个isa指针指向当前的类,当类的对象第一次被观察,那么系统就会将isa指针指向动态生成的这个派生类,再给被监控的属性赋值时执行的其实是派生类里的setter方法。
5,键值观察通知依赖于NSObject的两个方法:willChangeValueForKey:和didChangeValueForKey:在一个被观察属性发生改变之前,will方法一定会被调用,这一次记录旧值,当发生改变后did方法被调用记录新值,继而调用observeValueForKey: ofObject:change:context:
6,KVO这套实现机制中,苹果偷偷重写了class方法,让我们误认为还是使用的当前类,从而隐藏派生类。
KVC
KVC实现原理:
KVC会遍历字典,将字典里的的key和value的值,赋值给模型中对应的属性,他会调用模型中对应属性的setter方法,如果没有setter方法,会判断有没有跟key同名的属性,有就直接赋值,没有就判断有没有跟属性相同带有下划线的属性,有就直接赋值,没有就报错,找不到对应的成员属性。