为什么这个Swift代码不起作用 - 在Swift中混合使用Objective-C类

时间:2014-09-09 16:03:38

标签: objective-c swift

我有一个很大的背景作为c ++ dev,但我仍然是Swift / Objective-C区域的新手。我正在尝试构建一个类层次结构,我对这段代码感到困惑:

protocol CADelegate : class {
    func g()
}

class CA : NSObject {
    init(i: Int) {}

    func f() {
        if let del = getDelegate() {
            del.g()
        } else {
            println("delegate is null")
        }
    }

    private func getDelegate() -> CADelegate? {
        return nil
    }
}

class CB : CA {
    override init(i: Int) {
        super.init(i:i)
    }

    var delegate: CADelegate!

    private override func getDelegate() -> CADelegate? {
        return delegate
    }
}

class Client : CADelegate {
    func g() {
        println("CA delegate")
    }
}

class ViewController : ... {
    override func viewDidLoad() {
        var cb = CB(i: 1)
        var client = Client()
        cb.delegate = client // the problem row!!!
        cb.f()
    }
}

在“问题行”上我收到运行时错误EXC_BAD_ACCESS(code = 1,address = ...)。

有人可以帮我解决这个问题吗?我知道我做错了,因为我习惯使用C ++习语和编程风格。

注意:如果委托属性很弱,同样如此,就像在原始代码中一样。

编辑1: 我正在使用XCode6 Beta 7

编辑2: 事实证明它不是100%可重复的。 5次中有3次正在工作但是另外2次我遇到了错误的访问异常。它看起来像一个竞争条件,但我没有使用任何其他任务/线程。这是我的主视图控制器,应该在视图控制器初始化时调用viewDidLoad。

编辑3: 更奇怪的是 - 如果我在CA和CB中删除我的构造函数,并在没有int参数的情况下更改CB的创建,问题就会消失!我现在肯定它看起来像个bug:)

0 个答案:

没有答案