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() {
}
}
很明显,您可以像那样创建 A
和 B
的实例。
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 似乎修复了这个错误。谢谢亚历克斯
此代码生成 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() {
}
}
很明显,您可以像那样创建 A
和 B
的实例。
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 似乎修复了这个错误。谢谢亚历克斯