我可以将标准 ivars 和属性添加到 NSManagedObject 吗?

Posted

技术标签:

【中文标题】我可以将标准 ivars 和属性添加到 NSManagedObject 吗?【英文标题】:Can I add standard ivars and properties to an NSManagedObject? 【发布时间】:2012-06-07 18:12:24 【问题描述】:

我可以向 NSManagedObject 中添加标准属性吗?我不希望保存这些对象,但我希望它们在应用程序运行的整个生命周期内都存在。

我可以添加一个由 ivar 支持的 getter 和 setter 吗?

【问题讨论】:

【参考方案1】:

在这种情况下,通常使用“瞬态属性”。您可以像其他实体属性一样在核心数据模型中声明它们,但在数据模型检查器中将它们标记为“瞬态”。它们是您的核心数据模型的一部分,但不会持久化!

【讨论】:

谢谢。我认为标准属性不会被持久化,因为每次访问 ManagedObject 时对象本身可能不同,我是否正确?我注意到的是,如果我有一个 ManagedObject - SomeObject - 每次我获取它时,我实际上都会返回一个不同的对象/实例。 1.标准(非 CD)属性不会被持久化,因为 '@synthesize' 关键字设置属性及其访问器并用数据填充它们取决于用户。 CD 属性前面有关键字“@dynamic”,这意味着 CD 为用户处理属性的创建和初始数据提供。 2. 是的,我也观察到了,但我不知道这是否是上述行为的原因。 也许这是另一个问题。谢谢你的回答。 ***.com/questions/10938229/… 我不确定这是不是正确的答案;这有点误导,因为您不需要创建瞬态属性,除非您将在核心数据提取等中使用它们。对于通常的属性和 ivars,正确的答案是“是”,您可以按照自己的方式创建它们与任何其他对象,如下面的@melsam 所回答。【参考方案2】:

是的,您可以将自己的属性和方法添加到从 NSManagedObject 派生的类中。我一直这样做。您可以声明属性@dynamic(如果使用Core Data),或者简单地@synthesize 它们。

【讨论】:

谢谢。我注意到的是,如果我在标准属性上设置了一个值,那么下次访问该对象时,该值就不会保留。我认为这是因为每次访问 ManagedObject 时,实际上都会返回一个不同的对象,该对象从 Core Data 填充其属性。 坚持在哪里?在内存中还是在数据库中?如果有记忆,您是否正确声明和实例化对象? 在应用程序生命周期中持续存在。如果有一个 SomeManagedObject 类型的 ManagedObject,则每次获取该对象时,都会返回一个不同的实例。我假设它只是 COre Data 的工作方式。因此,如果我使用标准属性,我可以获取对象,设置一个值,然后如果我再次获取它,该值将被取消设置,而我的 CoreData 模型中定义的动态属性被正确设置。 这取决于 ManagedObject 本身的创建方式和位置以及它自己的生命周期。据我所知,托管对象的标准属性的行为与任何其他类的标准属性一样。

以上是关于我可以将标准 ivars 和属性添加到 NSManagedObject 吗?的主要内容,如果未能解决你的问题,请参考以下文章

属性和 ivars 的问题

向 nsmangedobject 添加非持久变量

主从模板中的属性和 ivar

错误 [IRForTarget]:在向 MKMapView 添加叠加层时找不到 Objective-C 间接 ivar 符号

Objective C - 使用属性获取访问器与直接使用 iVar

核心数据的 Objective C 属性与 ivar 问题