关于ios:@NSManaged做什么?

What does @NSManaged do?

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

我注意到的关于@NSManaged的事情,不是基于文档,而是通过重复使用:

  • 它神奇地取代了键值编码。
  • 它大致相当于Objective-C中的@dynamic(我不太了解)
  • 我需要它从Parse SDK子类PFObject。它通常使用kvc从后端读取/写入值。
  • 当我不在初始值设定项中初始化时,用@NSManaged前缀任何变量将关闭编译器。
  • 正式定义(在Apple文档的核心数据中):

    Core Data provides the underlying storage and implementation of properties in subclasses of the NSManagedObject class. Add the @NSManaged attribute before each property definition in your managed object subclass that corresponds to an attribute or relationship in your Core Data model. Like the @dynamic attribute in Objective-C, the @NSManaged attribute informs the Swift compiler that the storage and implementation of a property will be provided at runtime. However, unlike @dynamic, the @NSManaged attribute is available only for Core Data support.

    我从中得到了什么:

    Variables with @NSManaged shall be exempt from compile time checks for something.

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

    @合成vs@dynamic,有什么区别?

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

    我本能地认识到一些我应该使用它的场景。我部分了解它的作用。但我所寻求的是对它所做事情的更纯粹的理解。

    进一步观察:

    Parse SDK中的PFObject依赖Key Value Coding访问其值。PFObject提供以下附件:

    objectForKey:

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

    setObject:forKey:

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

    据我所知,@NSManaged神奇地理解,我声明的变量自动使用了getset的上述访问器。我想知道它是如何做到的(如果我理解的是真的),以及它做的其他事情。


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

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

    @nsmanaged现在说"编译器,不要检查那些属性,因为我有核心数据来处理实现——它将在运行时出现。"

    所以你甚至可以说:@nsmanaged是一个更窄的动态版本的语法糖:)

    https://github.com/kyoheig3/dynamicblurview/issues/2
    这里甚至有人使用@nsmanaged而不使用cd,因为他想要@dynamic行为


    在Apple文档中,对于自定义托管对象类,它们引用诸如…enter image description here在我看来没有区别,我在目标C中使用了@dynamic,似乎@NSManaged是swift的替代品。


    以上答案是正确的。这是我的理解。

    @nsmanaged表示当我们运行应用程序时,变量将获得一些值。coredata自动为这些道具创建getter和setter。它会使编译器停止运行以获取警告。

    nsmanaged是nsObject的子类。@nsmanaged意味着将在运行时为这些属性提供额外的代码。它跟踪对这些属性所做的更改。