ios 通过kvc修改属性会触发kvo_OC面试题总结

iOS面试题

一、面向对象

1.1 一个NSObject对象占用多少内存?

1.2 对象的isa指针指向哪里?

1.3 OC的类信息存放在哪里?

二、KVO

2.1 iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?)

2.2 如何手动触发KVO?

2.3 直接修改成员变量会触发KVO么?

三、KVC

3.1 通过KVC修改属性会触发KVO么?

3.2 KVC的赋值和取值过程是怎样的?原理是什么?

四、Category

4.1 Category的使用场合是什么?

4.2 Category的实现原理

4.3 包含分类的类中的方法列表顺序

4.3 Category和Class Extension的区别是什么?

4.4 Category中有load方法吗?load方法是什么时候调用的?load 方法能继承吗?

4.5 load、initialize方法的区别什么?它们在category中的调用的顺序?以及出现继承时他们之间的调用过程?

4.6 Category能否添加成员变量?如果可以,如何给Category添加成员变量?

五、 Block

5.1 block的原理是怎样的?本质是什么?

5.2 __block的作用是什么?有什么使用注意点?

5.3 block的属性修饰词为什么是copy?使用block有哪些使用注意?

5.4 在block中修改NSMutableArray,需不需要添加__block?

一、面向对象

1.1 一个NSObject对象占用多少内存?

系统分配了16个字节给NSObject对象(通过malloc_size函数获得)

但NSObject对象内部只使用了8个字节的空间(64bit环境下,可以通过class_getInstanceSize函数获得)

1.2 对象的isa指针指向哪里?

instance对象的isa指向class对象

class对象的isa指向meta-class对象

meta-class对象的isa指向基类的meta-class对象

1.3 OC的类信息存放在哪里?

对象方法、属性、成员变量、协议信息,存放在class对象中 - 类方法,存放在meta-class对象中

成员变量的具体值,存放在instance对象

二、KVO

2.1 iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?)

利用RuntimeAPI动态生成一个子类,并且让instance对象的isa指向这个全新的子类

当修改instance对象的属性时,会调用Foundation的_NSSetXXXValueAndNotify函数

willChangeValueForKey:

父类原来的setter

didChangeValueForKey:

内部会触发监听器(Oberser)的监听方法( observeValueForKeyPath:ofObject:change:context:)

2.2 如何手动触发KVO?

手动调用willChangeValueForKey:和didChangeValueForKey:

2.3 直接修改成员变量会触发KVO么?

不会触发KVO

三、KVC

3.1 通过KVC修改属性会触发KVO么?

会触发KVO

3.2 KVC的赋值和取值过程是怎样的?原理是什么?

四、Category

4.1 Category的使用场合是什么?

4.2 Category的实现原理

Category编译之后的底层结构是struct category_t,里面存储着分类的对象方法、类方法、属性、协议信息

在程序运行的时候,runtime会将Category的数据,合并到类信息中(类对象、元类对象中)

4.3 包含分类的类中的方法列表顺序

方法列表顺序

编译文件靠后的分类的方法先导入方法列表

最后把当前类的方法导入方法列表

比如

MJPerson+Eat.h中有run, eat两个对象方法

MJPerson+Test.h中有run, test两个对象方法

MJPerson.h中有run一个对象方法

编译顺序如下

MJPerson+Eat.m

MJPerson.m

MJPerson+Test.m

那么MJPerson类对象的方法列表为

MJPerson+Test的run, test方法

MJPerson+Eat的run, eat方法

MJPerson的run方法

查看文件的编译顺序

修改文件编译顺序

4.3 Category和Class Extension的区别是什么?

Class Extension在编译的时候,它的数据就已经包含在类信息中

Category是在运行时,才会将数据合并到类信息中

4.4 Category中有load方法吗?load方法是什么时候调用的?load 方法能继承吗?

有load方法

load方法在runtime加载类、分类的时候调用

load方法可以继承,但是一般情况下不会主动去调用load方法,都是让系统自动调用

4.5 load、initialize方法的区别什么?它们在category中的调用的顺序?以及出现继承时他们之间的调用过程?

4.6 Category能否添加成员变量?如果可以,如何给Category添加成员变量?

不能直接给Category添加成员变量,但是可以间接实现Category有成员变量的效果

五、 Block

5.1 block的原理是怎样的?本质是什么?

封装了函数调用以及调用环境的OC对象

5.2 __block的作用是什么?有什么使用注意点?

5.3 block的属性修饰词为什么是copy?使用block有哪些使用注意?

block一旦没有进行copy操作,就不会在堆上

使用注意:循环引用问题

5.4 在block中修改NSMutableArray,需不需要添加__block?

如果修改的是NSMutableArray的存储内容的话,是不需要添加__block修饰的。

如果修改的是NSMutableArray对象的本身,那必须添加__block修饰。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值