美文网首页
OC语言特性相关面试问题

OC语言特性相关面试问题

作者: 骑着毛驴走起来 | 来源:发表于2019-11-01 16:49 被阅读0次

    一、分类

    1、你用分类都做了哪些事?
    (1)、声明私有方法
    (2)、分解体积庞大的类文件
    (3)、把Framework的私有方法公开
    2、特点
    (1)、运行时决议(运行时才会添加到宿主类)
    (2)、可以为系统类添加分类
    3、 分类中都可以添加哪些内容?
    (1)、实例方法
    (2)、类方法
    (3)、协议
    (4)、属性(只会生成set、get方法,不会生成成员变量)
    4、分类加载调用栈

    屏幕快照 2019-10-25 下午2.52.09.png

    5、源码分析
    (1)、分类添加的方法可以"覆盖"原类方法。
    (2)、同名分类方法谁能生效取决于编译顺序。
    (3)、名字相同的分类会引起编译报错。

    二、关联对象

    1、能否给分类添加”成员变量”?

    id objc_getAssociatedObject(id object, const void * key)
    void objc_setAssociatedObject(id object, const void * key, id value, objc_AssociationPolicy policy)
    void objc_removeAssociatedObjects(id object)
    

    2、(关联对象的本质)分类添加的成员变量,添加到成员变量数组里面了吗?
    (1)、关联对象由AssociationsManger管理,并在AssociationsHashMap存储。
    (2)、所有对象的关联内容都在同一个全局容器中。

    屏幕快照 2019-10-25 下午3.21.41.png 屏幕快照 2019-10-25 下午4.01.52.png

    3、源码分析

    三、扩展

    1、一般用扩展做什么?
    (1)、声明私有属性
    (2)、声明私有方法
    (3)、声明私有成员变量
    2、特点?
    (1)、编译时决议
    (2)、只以声明的形式存在,多数情况下寄生于宿主类的.m中。
    (3)、不能为系统类添加扩展。

    四、代理

    1、准确的说是一种软件设计模式。
    2、iOS当中以@protocol形式体现。
    3、传递方式一对一。
    4、工作流程。

    屏幕快照 2019-10-25 下午4.33.38.png

    5、一般声明为weak,以规避循环引用。

    屏幕快照 2019-10-25 下午4.35.06.png

    五、通知(NSNotification)

    1、特点
    (1)、是使用观察者模式来实现的用于跨层传递消息的机制。
    (2)、传递方式为一对多。
    2、如何实现通知机制?

    屏幕快照 2019-10-25 下午4.47.09.png

    六、KVO

    1、KVO介绍
    KVO是Key-value observing的缩写。
    KVO是OC对观察者设计模式的又一实现。
    Apple使用了 isa 混写 (isa-swizzling) 来实现KVO。

    屏幕快照 2019-10-29 下午4.44.37.png

    2、特点
    使用setter方法改变值,KVO才会生效。
    使用setValue: forKey: 改变值,KVO才会生效。
    成员变量直接修改,需手动添加KVO才会生效。
    3、通过kvc设置value能否生效?为什么
    可以,kvc会重写setter方法。
    4、通过成员变量直接赋值value能否生效?
    不可以。可以在给成员变量赋值前后手动添加 [self willChangeValueForKey: ] 和 [self didChangeValueForKey: ] 。didChangeValueForKey方法会触发KVO回调。

    七、KVC

    KVC是key-value coding的缩写。
    -(id)valueForKey:(NSString *)key
    -(void)setValue:(id)value forKey:(NSString *)key
    1、-(id)valueForKey:(NSString *)key 介绍

    屏幕快照 2019-10-29 下午5.14.29.png 屏幕快照 2019-10-29 下午5.15.42.png 屏幕快照 2019-10-29 下午5.16.45.png

    2、-(void)setValue:(id)value forKey:(NSString *)key 介绍

    屏幕快照 2019-10-29 下午5.18.26.png

    八、属性关键字

    1、读写权限 readonly、readwrite(默认)
    2、原子性 atomic(默认)、nonatomic。
    atomic只能保证赋值和获取是线程安全(成员属性),不能保证操作和访问线程安全。例如NSArray,可以保证赋值和获取对象线程安全,不能保证删除和添加对象线程安全。
    3、引用计数
    (1)、retain/strong 都用于修饰对象。
    (2)、assign/unsafe_unretained
    修饰基本数据类型,如int、BOOL等。
    修饰对象类型时,不改变其引用计数。
    会产生悬垂指针。
    (3)、weak
    不改变被修饰对象的引用计数。
    所指对象在被释放之后会自动置为nil。
    (4)、copy
    1>、深拷贝、浅拷贝区别
    是否开辟了新的内存空间
    是否影响了引用计数

    2>、

    屏幕快照 2019-10-29 下午5.48.33.png

    总结:
    可变对象的copy和mutableCopy都是深拷贝。
    不可变对象的copy是浅拷贝,mutableCopy是深拷贝。
    copy方法返回的对象都是不可变对象。

    3>、copy面试题

    屏幕快照 2019-10-29 下午5.52.18.png

    OC语言特性面试总结

    1、MRC下如何重写retain修饰变量的setter方法?

    屏幕快照 2019-10-29 下午5.55.17.png

    2、请简述分类实现原理。
    3、KVO的实现原理是咋样的?
    4、能否为分类添加成员变量?

    相关文章

      网友评论

          本文标题:OC语言特性相关面试问题

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