swift - UnsafePointer<Int8> 不工作

标签 swift unsafe-pointers

以下单元测试总是失败,因为某些 UnsafePointer 与其他 UnsafePointer 相同。我观察到至少 3 个字符串的这种行为。 我在 High Sierra 版本 10.13.1 (17B48) 上使用 Xcode 版本 9.1 (9B55)。

func testUnsafePointer() {
    let a = "aaa"
    let b = "bbb"
    let c = "ccc"

    let ua = UnsafePointer<Int8>(a)
    let ub = UnsafePointer<Int8>(b)
    let uc = UnsafePointer<Int8>(c)

    print("a: '\(a)', ua: '\(ua)'")
    print("b: '\(b)', ub: '\(ub)'")
    print("c: '\(c)', uc: '\(uc)'")

    XCTAssertTrue(ua != ub)
    XCTAssertTrue(ub != uc)
    XCTAssertTrue(uc != ua)
}

打印输出看起来与此类似

a: 'aaa', ua: '0x000060c000056a30'
b: 'bbb', ub: '0x00006080000530d0'
c: 'ccc', uc: '0x00006080000530d0'

注意。在 Swift Playground 中,一切看起来都很好。

最佳答案

let ua = UnsafePointer<Int8>(a)

init(_ other: UnsafePointer<Pointee>)

UnsafePointer的初始化器叫做。 IE。你正在路过 swift String函数取 UnsafePointer<Int8> 争论。在这种情况下,将创建一个临时 C 字符串表示形式并将其传递给函数, 比较String value to UnsafePointer<UInt8> function parameter behavior .

该临时 C 字符串仅在函数执行期间有效 调用,并且返回时,不能保证内存指向 至 ua仍然包含该 C 字符串(或任何有效数据)。此外,

let ua = UnsafePointer<Int8>(a)
let ub = UnsafePointer<Int8>(b)
let uc = UnsafePointer<Int8>(c)

可以使用相同的存储空间来存储临时 C 字符串,在这种情况下 正如您所观察到的,指针将是相等的。


如果您的目的是调用 C 函数,取 const char *参数,那么你可以简单地传递 Swift 字符串。编译器 将插入必要的代码来创建 C 字符串表示形式 (在函数调用期间再次有效), 如 String value to UnsafePointer<UInt8> function parameter behavior 中所述:

let a = "aaa"
let b = "bbb"
let c = "ccc"

cfunc(a, b, c)

关于swift - UnsafePointer<Int8> 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47295029/

相关文章:

ios - 在 Storyboard本身中将自定义类添加到 UILabel 时如何查看更改?

ios - 将 CUnsignedChar 指针转换为 CChar 指针

swift - 警告: Initialization of 'UnsafeBufferPointer<T>' results in a dangling buffer pointer

ios - 防止 RxSwift 中的冗余操作

swift - 如何获取 Swift 枚举的计数?

swift - Swift 中的类与结构(复制)

swift - 我是否需要释放一个 UnsafeBufferPointer 或在缓冲区指针的起始内存位置使用的 UnsafePointer?

swift - UImageView 的动画位置

ios - 如何在 iOS 文件系统中存储来自 UnsafeMutablePointer 的数据

Swift 在范围内改变数据