前言:
最近把 iOS 面试中可能会遇到的问题整理了一番, 题目大部分是网上收录的, 方便自己巩固复习, 也分享给大家; 希望对大家有所帮助!
- 对于答案,不一定都合适,欢迎大家积极讨论;整理不易,如果您觉得还不错,麻烦在文末 “点个赞” ,或者留下您的评论“Mark” 一下,谢谢您的支持
iOS面试题-面试常问问题(三)
1. 一个OC对象占用多少内存
- 系统分配了16个字节给NSObject对象(通过
malloc_size
函数获得) - 但NSObject对象内部只使用了8个字节的空间(64bit环境下,可以通过
class_getInstanceSize
函数获得)
2. 对象的isa指针指向哪里?
- instance对象的isa指向class对象
- class对象的isa指向meta-class对象
- meta-class对象的isa指向基类的meta-class对象
3.OC的类信息存放在哪里?
- 对象方法、属性、成员变量、协议信息,存放在class对象中
- 类方法,存放在meta-class对象中
- 成员变量的具体值,存放在instance对象
4.iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?)
- 利用RuntimeAPI动态生成一个子类,并且让instance对象的isa指向这个全新的子类
- 当修改instance对象的属性时,会调用Foundation的_NSSetXXXValueAndNotify函数
willChangeValueForKey:
父类原来的setter
didChangeValueForKey: - 内部会触发监听器(Oberser)的监听方法(
observeValueForKeyPath:ofObject:change:context:
)
精选全网 · iOS面试题答案PDF文集
- 获取加小编的iOS技术交流圈:937 194 184,直接获取
5.如何手动触发KVO?
手动调用willChangeValueForKey:和didChangeValueForKey:
- (void)viewDidLoad {
[super viewDidLoad];
Person *person = [[Person alloc]init];;
[p addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
[p willChangeValueForKey:@"name"];
[p didChangeValueForKey:@"name"];
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
NSLog(@"被观测对象:%@, 被观测的属性:%@, 值的改变: %@\n, 携带信息:%@", object, keyPath, change, context);
}
6.直接修改成员变量会触发KVO么?
- 不会触发KVO
7.通过KVC修改属性会触发KVO么?
- 会触发KVO
- KVC在赋值时候,内部会触发监听器(Oberser)的监听方法(observeValueForKeyPath:ofObject:change:context:) 发送通知
8.KVC的赋值和取值过程是怎样的?原理是什么?
- KVC的全称是Key-Value Coding,俗称“键值编码”,可以通过一个key来访问某个属性
- 调用 setValue:forKey:
setKey,_setKey ->找到了则进行赋值,未找到调用accessInstanceVarlableDirctly
是否允许修改value值,返回YES, 调用_key, _isKey, key, isKey 进行赋值
9.Category的使用场合是什么?
- 在不修改原有类代码的情况下,为类添对象方法或者类方法
- 或者为类关联新的属性
- 分解庞大的类文件
使用场合:
- 添加实例方法
- 添加类方法
- 添加协议
- 添加属性
- 关联成员变量
10.Category的实现原理
- Category编译之后的底层结构是
struct category_t
,里面存储着分类的对象方法、类方法、属性、协议信息 - 在程序运行的时候,runtime会将Category的数据,合并到类信息中(类对象、元类对象中)
11.Category和Class Extension的区别是什么?
- Class Extension在编译的时候,它的数据就已经包含在类信息中
- Category是在运行时,才会将数据合并到类信息中