KVC KVO delegate block NSNotification 的应用场景 注意事项
KVC,KVO应用场景:
-
-
KVC:
-
1.字典转模型 ,简化代码量
-
2.修改系统的只读变量: 例如自定义tabBar的时候,由于tabBar是只读属性,只能用KVC赋值.
-
3.可以任意修改一个对象的属性和变量(包括私有变量)
-
4.可以通过运算符层次查找对象的属性,keyPathTeacher *t = [Teacher alloc ] init];
t.chiild = [Child alloc ] init];
t.child.book = [Book alloc] init];
KVC 大招:XBLog(@"%@",ValueForKeyPath(@"child.book"));
-
-
-
KVO:监听属性的变化,记得及时移除,影响性能
代理/通知/block ? 如何选用:假如A和B需要通信,B需要获取A的消息
-
delegate:如果A和B有相互的关联,就用delegate ,代理是一对多,很多原声控件就是用的代理(UITextField,UITableView等)
-
notification: .采用单例的设计模式,如果没关系就用通知.,通知是多对多,而且发送的只管发送,接收的只管接收.当需要跨越多个控制器进行传值的时候,notification是一个最方便的选择.,使用完毕需要及时注销
-
KVO:用于监听属性的变化,观察者模式,可以是多对一
-
block:跟delegate使用场合类似,使用起来更简单一些.,但block使用都是在一对一
使用注意事项:
-
delegate:在代理中调用方法的时候是在系统的子线程,因此,当使用delegate进行UI操作的时候必须调用GCD的主线程方法,回到主线程操作. dispatch_async(dispatch_get_main_queue(), <^(void)block>),在block中写进行的UI操作代码。
-
通知:需要及时注销观察者,这种bug较难查找,不能滥用,否则出现问题也是难于追查
-
block: 1.block中的对象会自动进行一次retain操作.容易造成内存泄漏2.block内部默认引用为强引用,容易造成循环引用
使用场景的对比:
-
回调方法:在一些完成之后的问题处理上,一般使用delegate和block,比如网络请求完成后的回调,页面加载完成后的回调.此时,如果是一对一传输回调,就用blcok,因为使用简单.如果是一对多,则delegate更有优势
-
跨层通信:使用通知
-
UI响应事件:用delegate,苹果的很多原生控件就是这么做的
-
简单的值传递:还是block更加高效,代理还需要设置和遵守协议.