为什么添加"动态"可以修复我的错误访问问题?

Sno*_*man 32 swift

我有一个与iOS 8 Beta 5一起出现的奇怪问题(此问题在以前的版本中没有出现).

我试图创建一个空项目并尝试复制该问题,但我无法这样做,所以我不太确定问题出在哪里.

我所看到的是,尝试访问自定义NSManagedObject子类的方法会导致奇怪的EXC_BAD_ACCESS错误.

例如:

  var titleWithComma: String {
       return "\(self.title),"
  }
Run Code Online (Sandbox Code Playgroud)

此方法在许多其他方法中,在调用时会导致此问题.但是,dynamic在它之前添加关键字会使问题消失:

  dynamic var titleWithComma: String {
       return "\(self.title),"
  }
Run Code Online (Sandbox Code Playgroud)

我知道我没有提供足够的信息,因为我老实说不知道如何查明实际问题,但任何人都可以解释可能发生的事情,以及为什么添加dynamic可以解决这个问题?

Azr*_*mil 68

来自Swift语言参考(语言参考>声明>声明修饰符)

将此修饰符应用于可由Objective-C表示的类的任何成员.使用动态修饰符标记成员声明时,始终使用Objective-C运行时动态调度对该成员的访问.编译器从不内联或不虚拟化对该成员的访问.

因为使用Objective-C运行时调度使用dynamic修饰符标记的声明,所以使用objc属性隐式标记它们.

这意味着您的属性/方法可以通过Objective-C代码或类访问.通常,当您对Swift类的Objective-C基类进行子类化时,就会发生这种情况.

  • 假设标记为`@ objc`的类具有隐式"动态"的所有成员是否安全? (4认同)
  • 这是正确的答案.其他人正在谈论Obj-C` @ dynamic`修饰符,其中Swift`动态`是一个独特的东西. (3认同)

Kae*_*ure 2

这是来自预发布的 Swift / Objective-C 互操作性文档:

实现核心数据管理对象子类

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

因此,由于 Core Data 在幕后使用了一些 Objective-C 运行时功能,因此需要对 Swift 属性进行特殊注释。