@NSManaged 有啥作用?
Posted
技术标签:
【中文标题】@NSManaged 有啥作用?【英文标题】:What does @NSManaged do?@NSManaged 有什么作用? 【发布时间】:2015-09-30 04:39:44 【问题描述】:我在各种场合都遇到过这个关键字。我有点知道它应该做什么。但我真的很想更好地理解它。
我对@987654324@ 的发现——不是基于文档,而是通过反复使用:
-
它神奇地取代了键值编码。
大致相当于Objective-C中的
@dynamic
(我不太了解)
我需要它从Parse SDK
继承PFObject
。它通常使用 KVC 从后端读取/写入值。
当我不在初始化程序中初始化时,使用@NSManaged
为任何变量添加前缀将关闭编译器。
正式定义(在 Core Data Apple Docs 中):
Core Data 在 NSManagedObject 类的子类中提供底层存储和属性实现。在托管对象子类中与核心数据模型中的属性或关系相对应的每个属性定义之前添加 @NSManaged 属性。与 Objective-C 中的 @dynamic 属性一样,@NSManaged 属性通知 Swift 编译器,属性的存储和实现将在运行时提供。但是,与@dynamic 不同,@NSManaged 属性仅适用于 Core Data 支持。
我从中得到了什么:
带有
@NSManaged
的变量应免于something的编译时检查。
我已阅读有关此问题的正式文档和其他各种 SO 问题:
@synthesize vs @dynamic, what are the differences?
What is common case for @dynamic usage?
我本能地识别出我应该使用它的一些场景。我部分知道它的作用。但我寻求的是对它的作用的更纯粹的理解。
进一步观察:
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
神奇地 理解我声明的变量自动使用上述对get
和set
的访问器。我想知道它是如何做到的(如果我理解的是真的),以及它还能做什么。
【问题讨论】:
你有没有发现你观察到的行为(在进一步观察中)是如何实现的? @NSManaged 如何使用正确的访问器? @NSManaged 属性仅适用于 Core Data 支持并不完全正确。您还需要将它用于要在其上设置动画的 CoreAnimation swift 变量:***.com/questions/24150243/… 【参考方案1】:上述答案是正确的。这是我的理解。
@NSManaged 表示当我们运行应用程序时变量会得到一些值。 Coredata 会自动为这些 props 创建 getter 和 setter。它使编译器静音以获取警告。
NSmanaged 是 NSObject 的子类。 @NSManaged 表示将在运行时为这些道具提供额外的代码。 它跟踪对这些属性所做的更改。
【讨论】:
【参考方案2】:在apple docs 中,对于自定义托管对象类,他们引用了属性示例,例如...
对我来说似乎没有区别,我在目标 C 中使用了 @dynamic
,似乎 @NSManaged
是 Swift 中的替代品。
【讨论】:
【参考方案3】:是的,它确实有点像@dynamic —— 从技术上讲,它甚至可能是相同的。语义上略有不同:
@dynamic 说'编译器,不要检查我的属性是否也实现了。您可能看不到任何代码,但我保证它会在运行时工作'
@NSManaged 现在说“编译器,不要检查这些属性,因为我有核心数据来处理实现 - 它会在运行时出现”
所以你甚至可以说:@NSManaged 是语法糖,是动态的更窄版本:)
https://github.com/KyoheiG3/DynamicBlurView/issues/2 这里有人甚至在没有 CD 的情况下使用 @NSManaged,因为他想要 @dynamic 行为
【讨论】:
我想深入探讨一下这个问题 - 编译器通常如何知道属性是如何实现的,@NSManaged
如何使编译器将此责任推迟到其他地方?覆盖方法时是否类似于super
调用? @NSManaged
是否告诉编译器:“从超类获取实现细节”?
通常,在编译时,方法(或属性)的机器代码必须存在——这就是编译器检查的内容。但是 objC/swift 运行时支持在运行时添加机器代码......然后有人必须及时添加代码:) 使用 NSManaged,coreData 就是为你做的。代码不在超类中,而是动态生成的
@KelvinLau 你还有问题吗?
@Daij-Djan 实际上,从运行时的角度来看,@NSManaged
似乎与@dynamic
完全相同。 cocoaexposed.com/2015/nsmanaged-vs-dynamic-in-swift
你能看到here吗?我测试了以下内容:“将@NSManaged public var name: String?
之类的东西直接转储到现有的NSManagedObject
子类中。似乎这是不允许的。我试图做entity.name = "John"
但我得到无法识别的选择器错误。我相信这是合理的,即不使用核心数据模型编辑器未创建 setter/getter 访问器方法。”那正确吗?还是不需要使用 Core Data Model Editor 来生成访问器?以上是关于@NSManaged 有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章
management.server.port 和 management.port 属性有啥区别?
seagull license server 是啥软件?有啥作用?
配置 management.properties 在 profiling 远程 JVM 中有啥用
managed-schema 和 schema.xml 有啥区别