KVC 使用方法详解及底层实现

  • Post author:
  • Post category:其他


你要知道的KVC、KVO、Delegate、Notification都在这里


转载请注明出处

http://blog.csdn.net/u014205968/article/details/78224815

本系列文章主要通过讲解KVC、KVO、Delegate、Notification的使用方法,来探讨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(



版权声明:本文为u014205968原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。