在iOS文档中阅读KVC Compliant时。我试过测试一堂课。 KVC Class是否合规?
但我有一些问题:
属性“名称”,“年龄”没有设置者,并且该类仍然使用KVC而没有错误 并且不会解雇任何例外
如果没有为属性创建setter,编译器会做什么?可以 创建一对setter和getter?
Person.h
@interface Person : NSObject
{
NSString *name;
NSInteger age;
}
Person.m
@implementation Person
- (id)init
{
self = [super init];
if (self) {
name = @"Duc Nguyen";
age = 10;
}
return self;
}
ViewController.m
- (IBAction)showKeyKVC:(id)sender {
//--test kvc
name1.text = [person valueForKey:@"name"];
age1.text = [NSString stringWithFormat:@"%@", [person valueForKey:@"age"]];
}
当我按下按钮时,结果是:年龄:10岁,姓名:Duc Nguyen。 在这种情况下,我不明白班级如何使用KVC?
答案 0 :(得分:4)
答案在Accessor Search Patterns for Simple Attributes KVC指南中。
setValue的默认搜索模式:forKey:
当为属性调用
setValue:forKey:
的默认实现时,使用以下搜索模式:
- 在接收者的类中搜索名称与模式
set<Key>:
匹配的访问者方法。- 如果未找到访问者,并且接收者的类方法
醇>accessInstanceVariablesDirectly
返回YES
,则会在接收者中搜索名称与模式_<key>
匹配的实例变量,_is<Key>
,<key>
或is<Key>
,按此顺序。
默认实现是向accessInstanceVariablesDirectly
方法返回YES,因此KVC机制实际上是从name
和age
实例变量中获取值。