NSManagedObject子类生成的+ CoreDataProperties.m文件实际上并不需要?

tra*_*per 5 xcode core-data objective-c

当生成NSManagedObject子类Xcode创建两个额外的文件MyObject+CoreDataProperties.hMyObject+CoreDataProperties.m保持CoreData的东西从我们自己的代码了.

这很不错,但我注意到在WWDC剪辑+CoreDataProperties.m中他们的示例中没有该文件.所以我尝试在我的代码中删除这些,并且所有内容都编译并在没有它们的情况下正常运行,它们似乎根本不需要.

它们是否以某种方式被我忽略了,或者如果没有,那么为什么xcode会产生它们呢?

Ami*_*wad 3

简短的回答:

\n\n

不,没有必要。

\n\n

长答案:

\n\n

Objective-C 是一种动态类型、后期绑定的编程语言。简而言之,这意味着每个类型决策都可以在运行时而不是编译时做出,并且您可以访问对象的属性并向对象发送消息,而无需知道其类型(类)。

\n\n

但是,对于 Core Data 框架以及作为 Core Data 和模型用户的您来说,没有必要了解实体类型的托管对象的类型。实体类型甚至不需要特定的类型。(我不会经常生成类,如果生成,我也会手动生成。)因此,与其他编程语言相比,这些生成的类不需要为编译器提供类型。

\n\n

但是,编译器希望至少查看每个方法一次以获取签名(参数类型)。否则会发出警告。即使有可能有这样的工作代码 \xe2\x80\xa6

\n\n
NSManagedObject *person = \xe2\x80\xa6\nNSString *firstName = [person firstName];\n
Run Code Online (Sandbox Code Playgroud)\n\n

Person\xe2\x80\xa6 对于具有属性的实体类型firstName,编译器会警告你,他对方法一无所知\xe2\x80\x93firstName

\n\n

相反,您可以输入如下内容:

\n\n
NSManagedObject *person = \xe2\x80\xa6\nNSString *firstName = [person valueForKey:@"firstName"];\n
Run Code Online (Sandbox Code Playgroud)\n\n

(编译器知道-valueForKey:,因为这是在 中声明的方法NSObject。)

\n\n

除此之外,您还可以获得代码完成、检查输入错误等好处。但你不需要使用Xcode的代码生成工具。只需在接口的属性中声明这样一个类即可。可以使用动态生成访问器@dynamic。(我个人几乎从不使用静态代码生成。)

\n\n

编辑:在评论中添加了讨论结果。

\n\n

因此,有了类别的接口(“.h-file”),编译器就足以编译整个代码而不会发出警告。如果保证 \xe2\x80\x93 或在运行时 \xe2\x80\x93 检查可以分派相应的消息,这将在运行时起作用。从 Objective-C 一开始,这在许多情况下都是有意义的,即对于转发和非正式协议。在核心数据的上下文中,它用于动态生成标准访问器方法。一切正常,无需任何实施。

\n\n

然而,由于某些原因,人们希望有一个实现,即对值变化的内务处理。在这种情况下,拥有可编辑的存根实现会很有用。但对于标准行为来说,这是没有必要的。

\n