KVC KVO delegate block NSNotification 的应用场景 以及各种坑

来源:互联网 发布:外网连接linux服务器 编辑:程序博客网 时间:2024/05/10 00:45


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更加高效,代理还需要设置和遵守协议.

0 0
原创粉丝点击