【问题标题】:Generic function parameter in Swift points to invalid memorySwift 中的泛型函数参数指向无效内存
【发布时间】:2016-05-04 13:03:47
【问题描述】:

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

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
}

child 和 data 变量显然指向内存中的不同位置。 (因为数据指向一些无效的内存)

这似乎是通用函数的最基本设置是快速的,但它失败了。

我想我在做一些根本错误的事情。有人可以指出我正确的方向吗?谢谢。

【问题讨论】:

  • 使用unsafeAddressOfdatachild为我打印相同的内存地址。

标签: ios swift generics


【解决方案1】:

我已尝试将您建议的 lldb-tests 替换为普通的旧调试输出,并且一切正常。

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-tests,但不应该对调试版本进行优化。

换句话说,我的回答是“实际上你的代码没问题,但你的测试可能有问题”。

【讨论】:

  • 谢谢,我试图在我的程序中发现一个错误,并被 XCode 提供的所有错误调试信息分心。遗憾的是,登录控制台仍然是我调试代码的唯一方法......
  • 尝试在修改后的代码上使用调试器with调试输出。它可能会证明正确的结果,因为所有变量都实际使用了,并且无论如何都无法优化以保持程序的正确性。
猜你喜欢
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多