以下单元测试总是失败,因为某些不安全指针等于另一个指针。这种行为我至少观察了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'
注意。在快速的操场上一切看起来都很好。
最佳答案
在
let ua = UnsafePointer<Int8>(a)
这个
init(_ other: UnsafePointer<Pointee>)
调用了
UnsafePointer
的初始值设定项。也就是说你路过一个函数的swift
String
争论。在这种情况下,将创建一个临时C字符串表示并传递给函数,
比较String value to UnsafePointer<UInt8> function parameter behavior。
临时C字符串只在函数的持续时间内有效
调用,返回时,不能保证内存指向
to by
UnsafePointer<Int8>
仍然包含该c字符串(或任何有效数据)。此外,let ua = UnsafePointer<Int8>(a)
let ub = UnsafePointer<Int8>(b)
let uc = UnsafePointer<Int8>(c)
可以对临时C字符串使用相同的存储,在这种情况下
正如你所观察到的,指针是相等的。
如果您的意图是调用一个带
ua
参数的c函数,那么您可以简单地传递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/