代码在Playground运行良好;同时它产生EXC_I386_GPFLT错误

时间:2016-07-25 20:02:48

标签: swift exc-bad-access swift-playground swift3

我遇到了一个奇怪的问题,其中Playground打印出预期的结果,但同时我看到一个错误,告诉我由于EXC_I386_GPFLT错误导致执行被停止。

我正在使用Playground来模拟我正在编写的API包装器应该如何使用。这样做的想法是为未来的开发人员规划一个不错的API。

以下是我为计划我的包装而编写的整个“计划”代码。您可以将其复制并粘贴到Playground上,以查看操作中的问题:

class Anilist {
    init() {}

    internal class UserAPIs {
        weak var parent: Anilist? = nil

        init(parent: Anilist) {
            self.parent = parent
        }
    }

    lazy var user: UserAPIs = { [unowned self] in
        let userapi = UserAPIs(parent: self)
        return userapi
    }()
}

extension Anilist.UserAPIs {
    func me(_ completionHandler: (results: [String]) -> Void ) {
        // Do some logic, fetching stuff from parent
        completionHandler(results: ["Lorem", "Sammet"])
    }
}

let andy = Anilist()
andy.user.me { results in
    print(results)
}

奇怪的是,它正确打印["Lorem", "Sammet"],但同时我收到了错误。

Successful error!

我有read (for C++)其他一些questions关于此错误,但遗憾的是我无法解决此问题。我可以收集到的是这种情况正在发生,因为我试图访问的内存为零?总的来说,除了它是一种架构保护之外,我还没有找到关于此的更多信息。

虽然代码运行良好,但我对于将它放在我的实际代码上犹豫不决,因为我不知道它会如何表现。即使它在第一次运行时起作用,也很难预测它是否会在长期内产生错误。

编辑:

看起来它与计算的lazy var有关。将该行更改为:

lazy var user: UserAPIs = UserAPIs(parent: self)

按预期工作(例如,它打印数组并且不会给我EXC_I386_GPFLT错误。)

编辑2:

以前的编辑似乎是不准确的信息。

1 个答案:

答案 0 :(得分:0)

这不是一个真正的答案,而是一个解决方法,直到我找出其工作原理:

let andy = Anilist()
let someVar = andy.user.me { results in
    print(results)
}

这给出了constant someVar inferred to have type (), which maybe unexpected的编译时警告。

但是这样做:

let andy = Anilist()
let _ = andy.user.me { results
    print(results)
}

工作正常,没有任何错误。很奇怪。如果有人可以解释为什么会发生这种情况,那将是非常好的。