Xcode如何成功访问程序无法访问的数据?

时间:2017-12-07 01:42:28

标签: swift generics exc-bad-access

我正在运行Xcode 9,Swift 4,High Sierra。在我的代码中,我有一个映射,剪切和剥离,包括这作为闭包中的第一行:

let foo = graph.edges.map { (edge: Edge<Node>) -> (Int, Int) in
    print(edge)
    let fromvertex = (edge.from as? VertexElement)
        .
        .
        .
}

let from vertex ...

行上有一个断点

运行时,代码成功到断点,这是问题开始的地方。如果在那时我在调试器中执行po edge.from,我得到了预期的结果。如果我走一行,那么执行作业,我得到Thread 1: EXC_BAD_ACCESS (code=2, address=*whatever*)。然后我可以在那时执行po edge.from甚至po (edge.from as? VertexElement)并仍然获得预期的结果。

这怎么可能? edge.from中没有涉及任何选项,并且我认为自调试器找到数据后数据是否正确。

Edge是(正如您所期望的)泛型类,定义的第一部分是:

public class Edge<T>: NSObject, NSCoding, Codable where T: Hashable {
    public typealias Weight = SimWeight

    public let from: Vertex<T>
    public let to: Vertex<T>
    public var weight: Weight? = nil
        .
        .
        .
}

然后,Vertex的第一部分也是通用的,如下所示:

public struct Vertex<T>: Equatable, Codable where T: Hashable {
    public var data: T
    public let index: Int
    public var gridX: Int?
    public var gridY: Int?
        .
        .
        .
}

Node是另一个具体的类(不是通用的)

最后,我打开了地址清理工作。

所有这一切,我既没有看到异常的来源,也没有为什么调试器可以在程序无法获取数据时。任何想法有什么不对(甚至如何调试它?)

1 个答案:

答案 0 :(得分:0)

我只能怀疑编译器问题,因为现在通过重新组织代码来修复它。具体来说,我在Edge中创建了这个方法:

$b

然后将此帖子顶部的代码更改为:

func indirectEdge() throws -> IndirectEdge {
    guard let fromvx = self.from as? VertexElement,
        let tovx = self.to as? VertexElement,
        let weight = self.weight else {throw TypeError.notVertex}
    return IndirectEdge(from: fromvx.index, to: tovx.index, weight: weight)
}

此时一切都开始奏效,没有例外。 (是的,我更改了后面的代码以接受IndirectEdge;该代码更进一步,不应该有任何影响。)我期望的是异常将进入indirectEdge方法,但那是不是发生了什么。代码现在很好用,但可怕的是我无法弄明白为什么。