1.一个NSObject对象占用了多少内存?
系统分配了16个字节给NSObject对象(通过malloc_size函数获得)
NSObject对象内部只占用了8个字节(64bit环境下,可以通过class_getInstanceSize函数获得)
2.对象的isa指针指向哪里?
instance对象的isa指针指向class对象
class对象的isa指针指向meta-class对象
meta-class对像的isa指针指向基类的meta-clas对象
3.OC类信息存放在哪里?
对像方法,属性,成员变量,协议信息,存放在class对象中
类方法存放在meta-class对象中
成员变量的具体值,存放在instance对象
4.ios用什么方式实现对一个对象的KVO?(KVO的本质是什么?)
利用runtimeAPI自动生成一个子类,并让isa指针指向这个全新的子类
当修改instance对象的属性时,会调用Foundation的_NSSetXXXXValueAndNotify函数
*willChangeValueForKey:
*父类原来的setter
*didChangeValueForKey:
内部会触发监听器(oberser)的监听方法observeValueForKeyPath:ofObject:change:context:
5.如何手动触发KVO?
手动调用willChangeValueForKey:和didChangeValueForKey:
6.直接修改成员变量会触发KVO么?
不会触发KVO
7.通过KVC修改属性会触发KVO吗?
会触发KVO
8.kvc的赋值和取值过程是什么样的,原理是什么?
9.Category的实现原理?
Category编译之后的底层结构是struct category_t,里面存储着分类的对象方法,类方法,属性,协议信息
在程序运行的时候,runtime会将Category的数据,合并到类信息中(类对象,元类对象中)
-
Category和Class Extension的区别是什么?
Class Extension在编译的时候,它的数据就已经保存在类信息中
Category试运行时才会把类合并到类信息中 -
Category有load方法吗?load方法是什么时候调用的?load能实现继承吗?
有load方法
load方法在runtime加载类,分类时候调用
load可以继承,但一般情况下不会主动去调用load方法,都是让系统自动去调用
12.load和initialize方法的区别是什么?它们在Category的调用顺序?以及出现继承时它们之间的调用过程?
- Category能否添加成员变量?如果可以,如何给Category添加成员变量?
不可以直接给Category添加成员变量,但可以间接实现Category有成员变量的效果
14.block的原理是怎样的?本质是什么?
封装了调用函数以及调用环境的OC对象
15.__block的作用是什么?有什么使用注意点?
- block的属性修饰词为什么是copy,使用blcok时要注意哪些?
blcok没有copy操作,就不会在堆上
使用注意:循环引用问题
17.block在修改NSMutableArray时,需不需要添加__block?
网友评论