iOS面试题库——KVC与KVO

本文详细介绍了iOS中的KVC(Key-Value Coding)和KVO(Key-Value Observing)机制。KVC允许通过键来间接访问对象属性,主要方法包括valueForKey:和setValue:forKey:。KVO则是一种观察者模式实现,用于当对象属性改变时通知观察者。KVO的实现依赖于isa-swizzling,通过改变对象的isa指针指向一个中间类,从而在属性变更时触发通知。文章涵盖了KVO的使用步骤和手动触发监听通知的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

KVC与KVO

本文将会详解在面试中的常客——KVO实现的原理,在了解KVO之前我们要对KVC进行一个全面的了解,毕竟连官方文档都提到过:

important: In order to understand key-value observing, you must first understand key-value coding.

1.1KVC

KVC全称:Key-value coding(键-值编码),通过KVC机制我们可以间接的访问对象的属性。而KVC之所以能够访问属性是因为对象遵守了一个非正式的NSKeyValueCoding协议(NSObject开始就遵守了此协议,所以继承自NSObject的对象都可以使用KVC)。开发中我们都知道在对于属性可以使用gettersetter或者直接使用实例变量来进行直接访问和修改。但这些访问方式是需要依靠属性的get方法、set方法、变量名。随着对象定义的属性增加或者变动。编译器生成的这些gettersetter会越来越多。KVC则是通过是用字符串的名字Key来对属性进行访问和修改。

KVC中最关键的两个方法:

-valueForKey:
-setValue:forKey:

1.1.1 valueForKey:

-valueForKey:是通过\来获取属性的值。在一个对象实例中按get<Key><key>is<Key>_<key>顺序匹配。命中的Value的类型如果是对象直接返回。如果命中的Value是能被包装成NSNumber的数值类型。包装成NSNumber返回。不支持NSNumber的数值类型则包装成NSValue返回。如果没用命中调用-valueForUndefinedKey:抛出异常,valueForUndefinedKey:可在子类中重写忽略抛出的异常,自己处理。

@interface Person
@property (nonatomic, assign) CGFloat height;
@end
p.height = 119.0;
NSNumber *height = [p valueForKey:@"height"]; //CGFloat 包装成NSNumber。

注意

  1. 上述的查找过程中省略了很多其他情况下的查找 countOf<Key>, objectIn<Key>AtIndex:, countOf<Key>, enumeratorOf<Key>, memberOf<Key>:,有兴趣的同学可以去
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FY_Chao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值