@NSManaged做了什么?

时间:2015-07-11 13:15:26

标签: ios objective-c swift cocoa-touch parse-platform

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

我注意到@NSManaged - 不是基于文档,而是基于重复使用:

  1. 它神奇地取代了键值编码。
  2. 大致相当于Objective-C中的@dynamic(我不太了解)
  3. 我需要它从PFObject继承Parse SDK。它通常使用KVC从/向后端读取/写入值。
  4. 使用@NSManaged对任何变量进行前缀将在我不在初始化程序中初始化时关闭编译器。
  5. 正式定义(在Core Data Apple Docs中):

      

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

    我从中获得了什么:

      

    @NSManaged的变量应免于某事的编译时检查。

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

    @synthesize vs @dynamic, what are the differences?

    What is common case for @dynamic usage?

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

    进一步观察:

    PFObject中的Parse SDK依靠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 神奇地了解我声明的变量会自动使用getset的上述访问者。我想知道它是如何做到的(如果我理解的是真的),以及它做的其他事情。

3 个答案:

答案 0 :(得分:36)

是的,它实际上就像@dynamic一样 - 技术上它甚至可能是相同的。在语义上有一点点差异:

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

@NSManaged现在说'编译器,不要检查那些属性,因为我有Core Data来处理实现 - 它会在运行时出现'

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

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

答案 1 :(得分:3)

apple docs中,对于自定义托管对象类,它们引用属性示例,如... enter image description here 对我来说似乎没有区别,我在目标C中使用@dynamic,似乎@NSManaged是Swift的替代品。

答案 2 :(得分:0)

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

@NSManaged表示在运行应用程序时变量会获得一些值。 Coredata会自动为这些道具创建getter和setter。它使编译器静默警告。

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