Ios @NSManaged做什么?

Ios @NSManaged做什么?,ios,objective-c,swift,cocoa-touch,parse-platform,Ios,Objective C,Swift,Cocoa Touch,Parse Platform,我在各种场合都遇到过这个关键词。我知道它应该做什么。但我真的想更好地理解它 关于@NSManaged,我注意到的不是基于文档,而是通过反复使用: 它神奇地取代了键值编码 它大致相当于Objective-C中的@dynamic(我不太了解) 我需要它从parsesdk中为PFObject创建子类。它通常使用KVC从后端读/写值 在任何变量前面加上@NSManaged将在我没有在初始值设定项中初始化时关闭编译器 正式定义(在核心数据苹果文档中): 核心数据提供NSManagedObject类子类中属

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

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

  • 它神奇地取代了键值编码
  • 它大致相当于Objective-C中的
    @dynamic
    (我不太了解)
  • 我需要它从
    parsesdk
    中为
    PFObject
    创建子类。它通常使用KVC从后端读/写值
  • 在任何变量前面加上
    @NSManaged
    将在我没有在初始值设定项中初始化时关闭编译器 正式定义(在核心数据苹果文档中):


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

    我从中得到了什么:

    带有
    @NSManaged
    的变量应免于编译时检查

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

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

    进一步观察:

    Parse SDK
    中的
    PFObject
    依赖
    键值编码来访问其值。
    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
    神奇地理解,我声明的变量自动使用上述访问器
    获取
    设置
    。我想知道它是如何做到这一点的(如果我所理解的是真的),以及它所做的其他任何事情。

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

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

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

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



    这里有人甚至在没有CD的情况下使用了@NSManaged,因为他希望在自定义托管对象类中使用@dynamic behavior,他们引用了如下属性示例。。。
    对我来说似乎没有区别,我在目标C中使用了
    @dynamic
    ,似乎
    @NSManaged
    是Swift中的替代品

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

    @NSManaged表示当我们运行应用程序时,变量将获得一些值。Coredata会自动为这些道具创建getter和setter。它使编译器对警告保持沉默

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

    我想更深入地探讨这个问题-编译器通常如何知道该属性是如何实现的,以及
    @NSManaged
    如何使编译器将此责任推迟到其他地方?重写方法时是否类似于
    super
    调用?
    @NSManaged
    是否告诉编译器:“从超类获取实现细节”?通常,在编译时,方法(或属性)的机器代码必须在那里——这就是编译器检查的内容。但是objC/swift运行时支持在运行时添加机器代码。。。然后必须有人及时添加代码:)通过NSManaged,coreData可以为您做到这一点。代码不在超类中,而是在fly@KelvinLau你在这里还有问题吗?@Daij Djan实际上,
    @NSManaged
    从运行时的角度看似乎与
    @dynamic
    完全相同。你能看见吗?我测试了以下内容:“将类似于
    @NSManaged public var name:String?
    的内容直接转储到现有的
    NSManagedObject
    子类中。似乎这是不允许的。我尝试执行
    entity.name=“John“
    但我遇到无法识别的选择器错误。我认为这是合理的,即不使用核心数据模型编辑器,就不会创建setter/getter访问器方法。“是这样吗?或者使用核心数据模型编辑器不必生成访问器?您有没有发现您观察到的行为(在进一步观察中)是如何发生的?”已实现?@NSManaged如何使用正确的访问器?@NSManaged属性仅适用于核心数据支持。这并不完全正确。您还需要将其用于要设置动画的CoreAnimation swift变量: