你要知道的KVC、KVO、Delegate、Notification都在这里
转载请注明出处
http://blog.csdn.net/u014205968/article/details/78224815
本系列文章主要通过讲解KVC、KVO、Delegate、Notification的使用方法,来探讨KVO、Delegate、Notification的区别以及相关使用场景,本系列文章将分一下几篇文章进行讲解,读者可按需查阅。
-
KVC 使用方法详解及底层实现
-
KVO 正确使用姿势进阶及底层实现
-
Protocol与Delegate 使用方法详解
-
NSNotificationCenter 通知使用方法详解
-
KVO、Delegate、Notification 区别及相关使用场景
KVC使用方法详解与底层实现
KVC(key value coding)
键值编码是一种可以使用字符串形式来间接操作对象相关属性的方法。
KVC
需要由
类别Category
NSKeyValueCoding
来支持,
OC
在实现
KVC
时没有采用实现接口的方式,而是针对
NSObject
创建了一个类别,通过这样的方式使得
NSObject
的子类可以自行实现
NSKeyValueCoding类别
定义的相关方法。
KVC
使用非常简单,但
KVC
却异常强大,最暗黑的功能就是它可以无视访问限制,无论是否为
private
都可以进行赋值或取值操作,
readonly
的属性也可以无视,提供了一种比
runtime
更便捷的方式来修改或访问系统级隐藏的属性,因此,经常在开发中通过
runtime
获取相关属性名后使用
KVC
来修改那些只读
readonly
或隐藏的属性。
KVC基础方法详解
KVC
常用方法主要由如下几个:
//获取属性名为key的属性的值
- (nullable id)valueForKey:(NSString *)key;
//设置属性名为key的属性的值为value
- (void)setValue:(nullable id)value forKey:(NSString *)key;
/*
提供一种类似于Java ONGL语法来访问嵌套属性
获取嵌套属性名为keyPath的属性的值
*/
- (nullable id)valueForKeyPath:(NSString *)keyPath;
//设置嵌套属性名为keyPath的属性的值为value
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
/*
获取属性名为key的属性值时,如果属性不存在则执行该方法,可自定义实现,
默认实现方式为抛出NSUnknownKeyException异常
*/
- (nullable id)valueForUndefinedKey:(NSString *)key;
/*
设置属性名为key的属性值为value时,如果属性不存在则执行该方法,可自定义实现,
默认实现方式为抛出NSUnknownKeyException异常
*/
- (void)setValue:(nullable id)value forUndefinedKey:(NSString *)key;
针对上述方法举一个栗子:
//Phone类
@interface Phone : NSObject
@property (nonatomic, strong) NSString *phoneNumber;
@end
@implementation Phone
@synthesize phoneNumber = _phoneNumber;
@end
//Person类
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSUInteger age;
//组合一个Phone的对象
@property (nonatomic, strong) Phone *phone;
- (void)showMyself;
@end
@implementation Person
@synthesize name = _name;
@synthesize age = _age;
@synthesize phone = _phone;
- (void)showMyself {
NSLog(@"My name is %@ I am %ld years old. my phone number is %@", self.name, self.age, self.phone.phoneNumber);
}
@end
int main(