iOS基础 - 深拷贝浅拷贝、KVO、KVC、代理、设计模式等

一、深拷贝与浅拷贝

      浅拷贝:是指针拷贝,对一个对象进行浅拷贝,相当于对指向对象的指针进行复制,产生一个新的指向这个对象的指针,那么就是有两个指针指向同一个对象,这个对象销毁后两个指针都应该置空。

  深拷贝:对一个对象进行拷贝,相当于对对象进行复制,产生一个新的对象,那么就有两个指针分别指向两个对象,当一个对象改变或者被销毁后拷贝出来的心的对象不受影响。

  实现深拷贝需要实现NSCopying协议,实现 - (id)copyWithZone:(NSZone *)zone 方法。党对一个property属性含有copy修饰符的时候,在进行赋值操作的时候实际上就是调用这个方法。

  父类实现深拷贝之后,子类只要重写copyWithZone方法,在方法内部调用父类的copyWithZone方法,之后实现自己的属性的处理。

  父类没有实现深拷贝,子类除了需要对自己的属性进行处理,还要对父类的属性进行处理。

 

二、KVO、NSNotification、delegate以及block的区别

  KVO就是cocoa框架实现的观察者模式,一般同KVC搭配使用,通过KVO可以检测一个值的变化,比如View的高度变化,键盘的高度变化等。是一对多的关系,一个值的变化会通知所有的观察者。NSNotification是通知,也是一对多的使用场景。在某些情况下,KVO和NSNotification是一样的,都是状态变化之后告知对方的。NSNotification的特点,就是急需要被观察者先主动发出通知,然后观察者注册监听再进行响应,比KVO多了发送通知的异步,但是其优点是监听不局限于属性的变化,还可以多种多样的状态变化进行监听,监听范围广,使用也更灵活。

  delegate是代理,就是我们不想做的事情交给别人去做。比如HR要求你完成一个功能,就通过delegate通知程序猿,程序猿会给HR通过代码来实现这些功能,完成的过程HR都不需要关心,只需要调用delegate(代理人)就可以了。所以delegate是一对一的关系。

  block是delegate的另一种形式,是函数式编程的一种形式。使用场景跟delegate一样,相比delegate更灵活,而且代理的实现更直观。

  KVO一般的使用场景是数据,需求是数据变化,比如股票价格,我们一般使用KVO(观察者模式)。delegate一般的使用场景是行为,需求是需要别人帮我做一件事情,比如说买东西,一般使用delegate。

  Notification一般是进行全局通知,比如超市大减价,通知大家都是购买。delegate是强关联,就是委托和代理双方互相知道,你委托别人买烟你就需要知道你叫的人,你叫的人也必须知道你要买什么烟。Notification是弱关联,发出消息,接收消息的人不需要知道是谁发的消息但能做出相应的反应,同理发消息的也不需要知道接收的人也可以正常发出消息。

 

三、设计模式6个原则

设计一个类的功能,如何划分粒度(单一职责)

接口隔离。

如果有一个鸟类,有飞的动作,一个鸵鸟继承它是合适的吗(里氏替换)

类之间的依赖如何依赖偶合度最小(依赖倒转) 高层依赖低层,低层不能依赖高层。依赖接口,不能依赖具体的类。

如果A要调用C函数,但C是B的成员类,应该如何设计?(迪米特)

如何设计类,能做到只增加代码,而不修改代码,有哪些经验(开放封闭) 通过设计模式解决。

posted on 2016-03-12 16:00  小鸟成长记  阅读(287)  评论(0编辑  收藏  举报

导航