为啥我不能使用“描述”作为核心数据实体的属性名称?

Posted

技术标签:

【中文标题】为啥我不能使用“描述”作为核心数据实体的属性名称?【英文标题】:Why can't I use "description" as an attribute name for a Core Data entity?为什么我不能使用“描述”作为核心数据实体的属性名称? 【发布时间】:2011-01-17 20:25:54 【问题描述】:

我有一个简单的核心数据实体,它有一个名为“description”的字符串属性。 程序在命中时崩溃:

valueForKey:@"description"

我将“description”属性更改为“text”,问题解决了。

为什么会这样?

“描述”是 Core Data 中的保留关键字吗?

和调用NSObject的描述方法有关系吗?

如果存在这些保留关键字,是否有参考?

【问题讨论】:

【参考方案1】:

因为它与NSObject 中的-description 方法冲突(回想一下,Core Data 动态生成属性访问器和修改器——名为“description”的属性需要创建一个名为-description 的访问器方法)。这在Core Data Programming Guide 和NSPropertyDescription Class Reference 中有记录:

请注意,属性名不能与 NSObject 或 NSManagedObject 的任何无参数方法名相同。例如,您不能为属性命名为“description”。 NSObject 上有数百个方法可能与属性名称冲突——而且这个列表可能会在没有来自框架或其他库的警告的情况下增长。您应该避免使用非常笼统的词(例如“字体”和“颜色”)以及与 Cocoa 范例重叠的词或短语(例如“isEditing”和“objectSpecifier”)。

【讨论】:

【参考方案2】:

description 不是 CoreData 中的保留关键字,但它是所有 Objective-C 对象固有的属性。它是 NSObject 类的一部分。

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/description

【讨论】:

它本身不是一个(声明的)属性,而是一个方法名。 问题是为什么 Core Data 不喜欢托管对象上的键 @"description"。 NOT:什么是“描述”方法?【参考方案3】:

我怀疑(尽管我不肯定)问题在于 Core Data 的运行时访问器生成存在问题。 Core Data 在运行时合成属性的访问器(和设置器),并将这些访问器添加到适当的类(同样,在运行时)。如果 Core Data 创建一个新的description 方法,覆盖-[NSObject description] 并将事务逻辑等放入方法中,那么任何调用-[NSObject description] 的代码都可能表现得“糟糕”。

【讨论】:

以上是关于为啥我不能使用“描述”作为核心数据实体的属性名称?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在 NSManagedObject 子类计算属性中使用关系? (核心数据,迅速)

为啥 Xcode 无法识别我的核心数据实体的属性

最佳实践? - 数组/字典作为核心数据实体属性 [关闭]

最佳实践? - 数组/字典作为核心数据实体属性 [关闭]

核心数据:父实体与关系

为啥向核心数据实体添加双重属性会导致远距离相关实体中的属性冲突出现 NSInternalInconsistencyException?