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

时间:2014-08-05 14:03:26

标签: swift

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

我尝试创建一个空项目并尝试复制该问题,但我无法这样做,因此我不太确定问题所在。

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

例如:

  var titleWithComma: String {
       return "\(self.title),"
  }

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

  dynamic var titleWithComma: String {
       return "\(self.title),"
  }

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

2 个答案:

答案 0 :(得分:68)

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

  

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

     

因为调度了使用动态修饰符标记的声明   使用Objective-C运行时,它们被隐式标记为objc   属性。

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

答案 1 :(得分:2)

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

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

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

因此,由于Core Data使用的一些Objective-C运行时功能,需要特别注释Swift属性。