我有一个与iOS 8 Beta 5一起出现的奇怪问题(以前的版本没有出现此问题)。
我尝试创建一个空项目并尝试复制该问题,但我无法这样做,因此我不太确定问题所在。
我所看到的是,尝试访问自定义NSManagedObject
子类的方法会导致奇怪的EXC_BAD_ACCESS错误。
例如:
var titleWithComma: String {
return "\(self.title),"
}
此方法在许多其他方法中,在调用时会导致此问题。但是,在它之前添加dynamic
关键字会导致问题消失:
dynamic var titleWithComma: String {
return "\(self.title),"
}
我知道我没有提供足够的信息,因为我老实说不知道如何查明实际问题,但任何人都可以解释可能发生的事情,以及为什么添加dynamic
可能会解决这个问题?
答案 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属性。