进大厂必看,iOS面试题-面试常问问题(三)

前言:

最近把 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是在运行时,才会将数据合并到类信息中
12.Category中有load方法吗?load方法是什么时候调用的?load 方法能继承吗?<
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值