Swift中的泛型函数参数指向无效内存



我将从一个示例设置开始。

class Parent {
    let parentProperty = 1
}
class Child : Parent {
    let childProperty = 2
}
class Test {
    func testMethod<T : Parent>(data: T) {
        // (llbd) print data
    }
}
let child = Child()
let test = Test()
// (lldb) print child
test.testMethod(child)

我暂停了在标有注释"(lldb)print…"的地方执行,并在Xcode的调试器控制台中执行了"print child/data"命令。

以下列出了上述命令的输出。

//打印子

(RingRingTests.Child) $R0 = 0x00007fcb886459a0 {
  RingRingTests.Parent = {
    parentProperty = 1
  }
  childProperty = 2
}

//打印数据

(RingRingTests.Child) $R1 = 0x0000000115a93818 {
  RingRingTests.Parent = {
    parentProperty = 140512143366480
  }
  childProperty = 4294967299
}

子变量和数据变量显然指向内存中的不同位置。(数据指向某个无效内存)

这似乎是通用函数的最基本设置是swift,但它正在失败。

我想我做错了什么。有人能给我指正确的方向吗?非常感谢。

我尝试用简单的旧调试输出替换您提出的lldb测试,一切都很好。

class Parent: CustomDebugStringConvertible {
    let parentProperty = 1
    var debugDescription: String { return "(parentProperty)" }
}
class Child: Parent {
    let childProperty = 2
    override var debugDescription: String { return "(parentProperty), (childProperty)" }
}
class Test {
    func testMethod<T : Parent>(data: T) {
        print(data)
    }
}
let child = Child()
let test = Test()
print(child) // 1, 2
test.testMethod(child) // 1, 2

一些优化可能会破坏lldb测试,但不应针对调试构建进行优化。

换言之,我的答案是"代码其实没问题,但测试可能出了问题"。

最新更新