@NSManaged做了什么?

我在各种场合遇到过这个关键字。 我知道该怎么做。 但我真的想要更好地理解它。

我注意到的@NSManaged – 不是基于文档,而是通过反复使用:

  1. 它神奇地取代关键的价值编码。
  2. 这大致相当于Objective-C中的@dynamic (我不太了解)
  3. 我需要它从Parse SDK PFObject 。 它通常使用KVC从/向后端读取/写入值。
  4. 使用@NSManaged前缀任何variables会在初始化程序中初始化时closures编译器。

正式的定义(在核心数据苹果文件中):

核心数据提供NSManagedObject类的子类中的属性的基础存储和实现。 在托pipe对象子类中与Core数据模型中的属性或关系相对应的每个属性定义之前添加@NSManaged属性。 与Objective-C中的@dynamic属性一样,@ NSManaged属性通知Swift编译器,在运行时将提供属性的存储和实现。 但是,与@dynamic不同,@ NSManaged属性仅适用于Core Data支持。

我从中得到了什么:

@NSManagedvariables应该免于编译时间检查。

我已经阅读了关于这个问题的正式文档和其他各种SO问题:

@synthesize vs @dynamic,有什么区别?

@dynamic用法常见的情况是什么?

我本能地认识到我应该使用它的一些场景。 我部分知道它做了什么。 但是我所追求的是对它所做的更纯粹的理解。

进一步观察:

Parse SDK中的PFObject依赖于Key Value Coding来访问其值。 PFObject提供了以下访问器:

objectForKey:

 let score = results.objectForKey("descriptionOfResult") //returns the descriptionOfResult value from the results object 

setObject:forKey:

 results.setObject("The results for a physics exam", forKey: "descriptionOfResult") //sets the value of descriptionOfResult 

据我的理解, @NSManaged 神奇的理解,我声明的variables自动使用上述访问器来getset 。 我想知道它是如何做到的(如果我理解的是真的),还有其他什么。

是的,它有点像@dynamic – 从技术上讲它甚至可能是相同的。 语义上有一点区别:

@dynamic说'编译器,不要检查我的属性是否也实现了。 可能没有代码可以看到,但我保证它可以在运行时工作“

@ NSManaged现在说'编译器,不要检查这些属性,因为我有核心数据来照顾实现 – 它将在运行时在那里'

所以你甚至可以说:@NSManaged是语法糖是一个更加狭隘的dynamic版本:)


https://github.com/KyoheiG3/DynamicBlurView/issues/2
这里有人甚至用@NSManaged没有CD,因为他想要@dynamic行为

在苹果文档中 ,对于自定义托pipe对象类,他们引用属性示例如… 在这里输入图像说明 对我来说似乎没有什么区别,我已经在目标C中使用了@dynamic ,看起来@NSManaged是在Swift中的replace。

上面提到的答案是正确的。 这是我的理解。

@NSManaged表示当我们运行应用程序时,variables会得到一些值。 Coredata自动为这些道具创buildgetter和setter。 它使编译器沉默警告。

NSmanaged是NSObject的子类。 @NSManaged意味着额外的代码将在运行时被赋予这些道具。 它跟踪对这些属性所做的更改。