EXC_BAD_ACCESS 在 Swift 中使用泛型、协议和继承创建对象时

EXC_BAD_ACCESS when creating an object with Generics, Protocols and Inheritance in Swift

此代码生成 EXC_BAD_ACCESS(即使在操场上)。

(我简化了我的代码以便更好地理解。)

准备:

// Playground - noun: a place where people can play

protocol EmptyInit {
    init();
}

class FirstBase {

}


class SecondBase : EmptyInit {
    required init(){

    }
}

class A : FirstBase, EmptyInit{
    required override init(){

    }
}

class B : SecondBase, EmptyInit {
    required init() {

    }
}

很明显,您可以像那样创建 AB 的实例。

A();
B();

假设需要在具有泛型的函数中创建 class 的实例:

func creation<T: EmptyInit>(x a:T.Type) -> T{
    var object = T()
    return object;
}

此代码运行时:

var b = creation(x: B.self);

此代码因 EXC_BAD_ACCESS

而崩溃
var a = creation(x: A.self);

link to the screenshot of the playground

这很奇怪,不是吗?我不明白。有任何想法吗? (甚至可能是 Swift 错误?)

更新 Swift 1.2 XCode 6.3 Beta 2(Beta 1 将不起作用): 您的代码现在运行没有任何问题和预期结果:

var b = creation(x: B.self); //{__lldb_expr_9.SecondBase}
var a = creation(x: A.self); //{__lldb_expr_11.FirstBase}

它们冲突是因为 FirstBase 没有 init 而 EmptyInit 是必需的 init。 这样就可以了:

protocol EmptyInit {
    init();
}

class FirstBase {
    required init(){

    }
}


class SecondBase : EmptyInit {
    required init(){

    }
}

class A : FirstBase, EmptyInit{
    required init(){

    }
}

class B : SecondBase, EmptyInit {
    required init() {

    }
}

A();
B();


func creation<T: EmptyInit>(x a:T.Type) -> T{
    var object = T()
    return object;
}

var b = creation(x: B.self); // SecondBase
var a = creation(x: A.self); // FirstBase

得到苹果的答复:

"We believe this issue has been addressed in the latest Xcode 6.3 beta 2, including iOS 8.3 SDK with Swift 1.2."

无法更新 atm。将检查(可能在 VM 中)然后 post 再次更新。

亚历克斯测试了它。 Apple 似乎修复了这个错误。谢谢亚历克斯