美文网首页面试题
面试技巧攻克(4)-iOS中对象间通信机制

面试技巧攻克(4)-iOS中对象间通信机制

作者: 一意孤行的程序猿 | 来源:发表于2020-07-29 16:49 被阅读0次

    一、delegate和block

    1、delegate和block的区别?block需要注意什么?

    delegate由代理设计模式演变而来,block是一种闭包的实现。
    block的优点:
    (1)更轻便,使用也简单
    (2)能够直接访问上下文
    (3)易于阅读
    缺点:
    (1)如果有多个方法,需要每个方法实现一个block,很烦琐
    (2)可能会造成循环引用
    (3)block使用会出现内存复制,成本更高
    delegate优点:
    (1)设计更加清晰,规范
    (2)易于书写文档
    (3)当有多个相关方法时,实现更加简单
    (4)使用成本低
    缺点:
    (1)代码更为复杂
    (2)不易于阅读和维护

    2、delegate修饰词使用weak,为什么不适用strong和assign?

    使用weak修饰,指向指针的对象不会被持有,引用计数不变,当指针指向的对象被释放时,会置为nil,使用strong的话会持有对象,这样会引起循环引用,使用assign和weak是相同的,唯一的区别就是当指向的对象被释放后,weak置为nil,再次发送消息,不会崩溃,而assign则成为野指针,再次发送消息,会引起崩溃。

    二、KVC和KVO

    1、什么是KVC和KVO?

    KVC - Key-Value-Coding 键值编码是一种使用字符串间接访问对象属性的一种机制。键值编码的间接访问方式其实是存取方法的一种代替,通过键值编码可以访问对象的公有变量和私有变量。

    - (nullable id)valueForKey:(NSString *)key;
    - (void)setValue:(nullable id)value forKey:(NSString *)key;
    
    - (nullable id)valueForKeyPath:(NSString *)keyPath;
    - (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
    
    

    KVO - Key-Value-Observing 键值观察是基于KVC实现的一种观察者机制,提供了观察对象的某一个属性变化的监听方法。

    //监听方法
    - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;
    //移除监听方法
    - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;
    
    //通知方法
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context;
    
    

    2、KVO的原理是什么?

    KVO利用runtime的机制,当对一个对象进行观察时,会在运行时创建一个该对象的子类,这个子类一般以NSKVONotifying_xxx(xxx为父类的名字)命名,子类中会重写所有被观察属性的set方法,除了创建子类,还会将该对象的isa指针指向这个子类,当被观察的对象属性修改时,通过isa找到子类,在通过子类的方法列表找到对应的set方法,set方法是被重写过得,里面实现了相关的通知。

    结交人脉

    最后推荐个我的iOS交流群:789143298
    '有一个共同的圈子很重要,结识人脉!里面都是iOS开发,全栈发展,欢迎入驻,共同进步!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!)

    收录:iOS大蝠

    相关文章

      网友评论

        本文标题:面试技巧攻克(4)-iOS中对象间通信机制

        本文链接:https://www.haomeiwen.com/subject/oqckrktx.html