gpt4 book ai didi

objective-c - 键值编码的要点是什么?

转载 作者:太空狗 更新时间:2023-10-30 03:17:57 28 4
gpt4 key购买 nike

从 Objective-C 2.0 开始,我们就有了 @properties 和自动生成的访问器方法。那么今天,键值编码的意义何在?什么情况下最好写

[myObject setValue:foo forKey:@"bar"];

而不是写作

[myObject setBar:foo];

甚至

myObject.bar = foo;

我不断看到使用 KVC 的文章和文档,但总是以一种似乎简单地使用属性会更好的方式。那么我为什么要使用 KVC?感谢您提供任何和所有见解。

最佳答案

手写 [myObject setValue:foo forKey:@"bar"] 几乎从来都不是可取的,用文字 @"bar"。当我们直到运行时才知道要访问哪个属性时,我们通常使用 KVC 来访问属性。

一个例子是 xib 中的导出。当您将文本字段的委托(delegate)导出连接到 xib 中的文件所有者时,xib 将连接记录为具有三个字段的对象:

  • 对文本字段的引用(具有 socket 的对象)
  • 对文件所有者占位符的引用(连接的目的地)
  • 作为字符串的导出名称,@"delegate"

在运行时,xib 加载器(UIKit 框架的一部分)反序列化文本字段。然后它反序列化连接对象并使用它来建立您在 xib 中连接的连接。 xib 加载器必须设置文本字段的属性(delegate 属性),但它不知道是哪个属性,直到它在运行时加载 xib,这在您的应用程序和 UIKit 框架之后很久被编译。

另一个直到运行时才知道访问哪个属性的例子是 Core Animation 的(鲜为人知的)能力,可以为您的 CALayer 子类的自定义属性设置动画。假设您创建了一个名为 PolygonLayerCALayer 子类,其属性名为 sides。您可以使用标准的 CABasicAnimationsides 属性设置动画:

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"sides"];
animation.fromValue = @3;
animation.toValue = @9;
animation.autoreverses = YES;
animation.duration = 1;
[myPolygonLayer addAnimation:animation forKey:@"sides"];

Presto,Core Animation 将使您图层的 sides 属性从 3 到 9 并返回。然而 Core Animation 的源代码对您的 sides 属性一无所知。 (查看 this question 了解更多详情。)

有时我们会使用 KVC,即使我们在编译时就知道该属性。一个例子是当我们想要利用 KVC 为我们做的额外工作时。例如,如果你有一个充满 Person 对象的 NSArray,并且你想获得每个人的名字的数组,你可以这样写:

NSMutableArray *firstNames = [NSMutableArray array];
for (Person *person in people) {
[firstNames addObject:person.firstName];
}

但这是 KVC 具有使其更简单的功能的情况。如果您使用 KVC 访问数组的属性,KVC 实际上会为您访问数组中每个元素的该属性:

NSArray *firstNames = [people valueForKey:@"firstName"];

另一个我们可能会使用 KVC 的示例,即使我们在编译时知道该属性是当该属性未静态声明为类的一部分时。例如,每个 NSManagedObject(Core Data 的一部分)根据 NSManagedObject 实例所代表的任何实体动态地为自己赋予属性。您可以使用 KVC 访问这些属性,但通常我们更喜欢 declare them in a subclass of NSManagedObject or in a category of NSManagedObject .

关于objective-c - 键值编码的要点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13386083/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com