【问题标题】:Declaring conformance to @objc protocol in empty extension breaks with EXC_BAD_INSTRUCTION用 EXC_BAD_INSTRUCTION 在空扩展中声明符合 @objc 协议
【发布时间】:2015-01-24 22:44:36
【问题描述】:

在将 Swift 协议与数组结合使用时遇到了很多麻烦,但在操场上开始出现问题之前,我什至无法重现我的整个问题。这是一个最小的例子。

我有两个协议和一个类Bus,它声明符合其中一个协议。此外,Bus 的空扩展声明符合其他协议:

import Foundation

@objc
protocol Displayable { var name: String {get} }

@objc
protocol Utterable { var utterance: String {get} }

class Bus : Displayable { var name = "a bus"; var utterance = "this is a bus"}

extension Bus : Utterable {}

var bus1 = Bus() // this line fails with EXC_BAD_INSTRUCTION

控制台输出可能看起来是随机的,但事实并非如此。如果我尝试创建Bus 的实例,我会始终如一地得到它:

objc[9658]: Method cache corrupted. This may be a message to an invalid object, or a memory error somewhere else.
objc[9658]: unused 0x0, SEL 0x10e4ce130, isa 0x1181f9ad0, cache 0x1181f9ae0, buckets 0x7fc491501060, mask 0x0, occupied 0x0
objc[9658]: unused 0 bytes, buckets 64 bytes
objc[9658]: selector 'resolveInstanceMethod:'
objc[9658]: isa '__lldb_expr_1314.Bus'
objc[9658]: Method cache corrupted.
  • 如果我们注释掉所有 @objc 属性,错误就会消失
  • 如果我们不符合Utterable,错误就会消失:extension Bus: Utterable{}

我的协议必须具有@objc属性的原因是,否则Obj-c运行时会在尝试执行var myDisplayables: [Displayable] = [ Bus() ]之类的操作时报错,或者以其他方式动态检查协议的一致性

再次请注意,这是一个最小示例。

使用 Swift 1.2 更新: 好像现在已经修好了。 Xcode 建议进行这些更改“因为协议需要它”:

class Bus : Displayable { @objc var name = "a bus"; @objc var utterance = "this is a bus"}

【问题讨论】:

    标签: swift protocols swift-playground swift-extensions swift-protocols


    【解决方案1】:

    我认为问题在于Utterable 协议有一个属性,该属性已在具体类中实现。

    您可能知道,扩展无法定义存储属性(仅限计算)。通过在扩展中采用协议,会发生一些错误 - 这显然是一个错误(它应该只是工作编译器应该引发编译错误)。

    要修复它,只需在类声明中采用协议而不是扩展:

    class Bus : Displayable, Utterable { var name = "a bus"; var utterance = "this is a bus"}
    
    extension Bus  {}
    

    令人惊讶的是,将utterance 属性转换为计算属性并将其移动到扩展正文中:

    extension Bus : Utterable {
        var utterance: String { return "this is a bus" }
    }
    

    没有解决问题 - 仍然是同样的错误。我认为这是证明这是一个错误。

    【讨论】:

      猜你喜欢
      • 2018-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      相关资源
      最近更新 更多