使用KVC / valueForKey vs属性访问NSManagedObject字段 - 哪个更好?

时间:2010-06-26 21:20:26

标签: iphone objective-c core-data coding-style

使用CoreData编写我的第一个应用程序。我用来指导我的书的代码如下:

// 'Person' is my managed object class
Person *newPerson = [NSEntityDescription
  insertNewObjectForEntityForName:@"Person"
  inManagedObjectContext:self.managedObjectContext];

[newPerson setValue:nameField.text forKey:@"name"];

这本书说使用了财产风格,例如

newPerson.name = nameField.text;

也有效,但“看到核心数据代码使用KVC方法很常见”

对我而言,我看不出使用KVC方法的一个原因;魔术字符串只是乞求运行时错误而且输入更多。

话虽这么说,我想了解一下现在关于做事的“iPhone方式”的习惯。

这些方法是否存在差异,如果大多数人使用第一种,KVC,方法......为什么?

3 个答案:

答案 0 :(得分:3)

大多数人不使用我见过的KVC方法;我没有,因为你描述的原因。

为了保存您的理智,请使用Mogenerator构建您的访问者:

http://rentzsch.github.com/mogenerator/

这是一个命令行工具,可以使用一些方便的方法生成可用于获取CoreData对象的代理对象 - 但更好的是,您可以添加自己的方法的某些类别叠加将不会被破坏从数据模型中生成类。

XCode也可以从你的模型中生成数据对象,但是这些类更简单(只是访问器),而且我认为mogenerator更容易重复使用(这很重要,因为随着时间的推移,你会倾向于改变模型)。也许下一个XCode在这方面会更好。

我通常会在名为“DataObjects”的Classes下的子目录中生成所有数据模型类 - 然后每次从数据模型重新生成导致创建新类的类时,您都可以重新添加整个目录(当您有新实体)。示例命令行运行如下:

 mogenerator -m ../MyProject.xcdatamodeld/MyProject-v1.xcdatamodel

它将从给定的数据模型生成当前目录中的类(在这种情况下,我有一个只有第一个版本的版本化模型)。

答案 1 :(得分:1)

与直接KVC使用相比,属性将导致性能提升。但是,KVC确实有其用途,特别是在使用keyPath时,而不仅仅是key

当您发现或动态访问对象上的值时,KVC也很有用。

对于每天使用,肯德尔绝对是正确的,使用发电机并利用属性。更容易编码,更易于维护等。但是KVC肯定有它的位置并且非常有用。

答案 2 :(得分:0)

name是NSEntityDescription的属性,因此newPerson.name没问题。

但是当你向自定义实体添加一个自定义属性时,它只在运行时知道 - 所以newPerson.favouriteRestaurant会触发编译时警告,即使它很好。

这很烦人。

摆脱它的一种方法是使用

[newPerson setValue:@"Crazy Maria's" forKey:@"favouriteRestaurant"]

当你使用运行时魔术时,这可以是一种有效的方法来阻止编译器在其他几种场景中唠叨。