有谁知道为什么每次执行processUnsafeRawPointer(key)
,打印出来的结果都不一样?
将String
直接传递给接受UnsafeRawPointer
参数的方法时会发生什么?
var key = "Key"
func jump() {
print("\ntest UnsafeRowPointer")
processUnsafeRawPointer(key)
processUnsafeRawPointer(&key)
}
func processUnsafeRawPointer(_ key: UnsafeRawPointer) {
print(key)
}
public static func main() {
jump()
jump()
jump()
}
控制台:
test UnsafeRowPointer
0x0000600000c104a0
0x000000010000d3c0
test UnsafeRowPointer
0x0000600000c104a0
0x000000010000d3c0
test UnsafeRowPointer
0x0000600000c18020
0x000000010000d3c0
1条答案
按热度按时间0qx6xfy61#
实际发生的事情记录在here中:
当你调用一个声明为接受
UnsafePointer<Type>
参数的函数时,你可以传递以下任意一个:...
String
值,如果Type为Int8
或UInt8
。该字符串在一个以零结尾的缓冲区中自动转换为UTF8,并将指向该缓冲区的指针传递给该函数。Type
类型的可变变量、属性或下标引用,它作为指向左侧标识符地址的指针传递。...
当你调用一个带有
UnsafeRawPointer
参数的函数时,你可以传递与UnsafePointer<Type>
相同的操作数,但可以传递任何类型的Type
。processUnsafeRawPointer(key)
是“String
值”的情况。将创建缓冲区。这个缓冲区被分配在内存中的某个地方,不必每次都是相同的位置。processUnsafeRawPointer(&key)
是“in-out表达式”的情况。由于key
是一个var
,这将只传递var
的位置,而不做任何其他事情。