自Objective-C 2.0以来,我们已经拥有了@properties
自动生成的访问器方法.那么今天,键值编码有什么意义呢?在什么情况下写作更可取
[myObject setValue:foo forKey:@"bar"];
Run Code Online (Sandbox Code Playgroud)
而不是写作
[myObject setBar:foo];
Run Code Online (Sandbox Code Playgroud)
甚至
myObject.bar = foo;
Run Code Online (Sandbox Code Playgroud)
我一直看到使用KVC的文章和文档,但总是以一种似乎只是简单地使用属性的方式会更好.那我为什么要用KVC呢?感谢您的所有见解.
rob*_*off 22
[myObject setValue:foo forKey:@"bar"]
用文字手写出来几乎绝对不可取@"bar"
.当我们在运行时不知道要访问哪个属性时,我们通常使用KVC来访问属性.
一个例子是xib中的插座.当您将文本字段的委托出口连接到xib中的文件所有者时,xib将连接记录为具有三个字段的对象:
@"delegate"
在运行时,xib加载器(UIKit框架的一部分)反序列化文本字段.然后它反序列化连接对象并使用它来建立您在xib中连接的连接.xib加载器必须设置文本字段(delegate
属性)的属性,但是在编译应用程序和UIKit框架很久之后,它在运行时加载xib之前不知道哪个属性.
另一个不知道在运行时访问哪个属性的例子是Core Animation为您的CALayer
子类的自定义属性设置动画的(鲜为人知的)能力.假设您使用CALayer
名为PolygonLayer
的属性创建被调用的子类sides
.您可以sides
使用标准为该属性设置动画CABasicAnimation
:
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"sides"];
animation.fromValue = @3;
animation.toValue = @9;
animation.autoreverses = YES;
animation.duration = 1;
[myPolygonLayer addAnimation:animation forKey:@"sides"];
Run Code Online (Sandbox Code Playgroud)
Presto,Core Animation会将图层的sides
属性设置为3到9并返回.然而,Core Animation的源代码对您的sides
财产一无所知.(查看此问题以获取更多详细信息.)
有时我们使用KVC,即使我们在编译时知道属性.一个例子是我们想利用KVC为我们做的额外工作.例如,如果你有一个NSArray
完整的Person
对象,并且你想获得每个人的名字的数组,你可以这样写:
NSMutableArray *firstNames = [NSMutableArray array];
for (Person *person in people) {
[firstNames addObject:person.firstName];
}
Run Code Online (Sandbox Code Playgroud)
但是,这是KVC具有使其更简单的功能的情况.如果使用KVC访问数组的属性,KVC将实际访问数组中每个元素的属性:
NSArray *firstNames = [people valueForKey:@"firstName"];
Run Code Online (Sandbox Code Playgroud)
另一个我们可能使用KVC的例子,即使我们在编译时知道属性,也就是当属性没有被静态声明为类的一部分时.例如,每个NSManagedObject(Core Data的一部分)基于所表示的实例的任何实体动态地给出其自身属性NSManagedObject
.您可以使用KVC访问这些属性,但通常我们更喜欢在子类NSManagedObject
或类别中声明它们NSManagedObject
.
归档时间: |
|
查看次数: |
1655 次 |
最近记录: |