KVO就是cocoa框架实现的观察者模式,一般同KVC搭配使用,通过KVO可以监测一个值得变化,比如View的高度变化。是一对多的关系,一个值得变化会通知所有的观察者。
NSNotification是通知,也是一对多的使用场景。在某些情况下,KVO和NSNotification是一样的,都是状态变化之后告知对方。NSNotification的特点,就是需要被观察者先主动发出通知,然后观察者注册监听后再来进行相应,比KVO多了发送通知的异步,但是其优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用也更灵活。
delegate是代理,就是我不想做的事情交给别人做。比如婴儿需要吃奶,就通过delegate通知他妈,他妈就会给他爬开衣服摁上去,拿出奶瓶,冲奶粉等,这些操作,这些都不要婴儿关心,只需要调用delegate(代理人 他妈)就可以了,由其他类完成所需要的操作。所以delegate是一对一关系。
block是delegate的另一种形式,是函数式编程的一种形式。使用场景跟delegate一样,相比delegate更灵活,而且代理的实现更直观。
KVO一般的使用场景是数据,需求是数据变化,比如股票价格变化,我们一般使用KVO(观察者模式)。delegate一般的使用场景是行为,需求是需要别人帮我做一件事情,比如买卖股票,我们一般使用delegate。Notification一般是进行全局通知,比如利好消息一出,通知大家去买入。delegate是强关联,就是委托和代理双方互相知道,你委托别人 送外卖 你就需要知道是哪一家送的,外卖小哥也要知道自己的顾客。Notification是弱关联,利好消息已发出,你不需要知道是谁发的也可以做出相应的反应,同理发消息的人也不需要知道接收的人也可以正常发出的消息。
另外说说block的循环引用问题:
block 会自动捕获block 内部使用的变量,并对其强引用.
self.myBlock = ^() {//其实注释中的代码,同样会造成循环引用
NSString*localString =self.blockString;
//NSString *localString = _blockString;//[self doSomething];
};
self对block进行强引用,block会对内部也进行强引用,当self想要释放的时候,去看看有没有别人强引用自己,发现有,不能释放,当block想释放的时候,也看看看自己有没有被强引用,发现有,也不能释放。至于办法,block代码块外面弱引用一下self
网友评论