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

标签 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 是另一个具体类(不是泛型)

最后,我打开了地址清理功能。

尽管如此,我既看不到异常从何而来,也看不到为什么调试器可以在程序无法获取数据时获取数据。任何想法出了什么问题(或者甚至如何调试它?)

最佳答案

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

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)
}

然后将本文顶部的代码更改为:

guard let indirectEdges = try? graph.edges.map({ (edge) throws -> IndirectEdge in
    return try edge.indirectEdge()
}) else {throw SimFileError.unimplementedOperation(why: "Don't know how to encode this graph")}
    .
    .
    .

从那时起,一切都开始运转,无一异常(exception)。 (是的,我更改了后面的代码以接受 IndirectEdge;该代码更进一步,不应该产生任何效果。)我预期是异常将转移到 indirectEdge 方法中,但事实就是如此不是发生了什么。代码现在可以工作了,这很好,但可怕的是我不知道为什么。

关于swift - Xcode 如何成功访问程序无法访问的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47686273/

相关文章:

ios - 以编程方式自动布局

IEnumerable<IList<object>> 上的 C# foreach 编译但不应该

java - Java 中的泛型(和通配符)

ios - 如何理解 EXC_BAC_ACCESS (SIGSEGV) KERN_INVALID_ADDRESS 日志?

swift - 声明变量时的 EXC_BAD_ACCESS

ios - 在 BG 全局队列中设置弱属性时意外的 EXC_BAD_ACCESS

ios - 在 SWIFT 中启动图像闪屏动画

ios - 退出 'while' 循环后数组项被删除?

ios - 将最大行数设置为 NSMutableAttributedString

swift - 如何将 `Any?` 转换为潜在可选的泛型类型