ios 将String传递给接受UnsafeRawPointer参数的方法

e0bqpujr  于 2023-06-07  发布在  iOS
关注(0)|答案(1)|浏览(478)

有谁知道为什么每次执行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
0qx6xfy6

0qx6xfy61#

实际发生的事情记录在here中:
当你调用一个声明为接受UnsafePointer<Type>参数的函数时,你可以传递以下任意一个:
...

  • String值,如果Type为Int8UInt8。该字符串在一个以零结尾的缓冲区中自动转换为UTF8,并将指向该缓冲区的指针传递给该函数。
  • 一种in-out表达式,包含Type类型的可变变量、属性或下标引用,它作为指向左侧标识符地址的指针传递。

...
当你调用一个带有UnsafeRawPointer参数的函数时,你可以传递与UnsafePointer<Type>相同的操作数,但可以传递任何类型的Type
processUnsafeRawPointer(key)是“String值”的情况。将创建缓冲区。这个缓冲区被分配在内存中的某个地方,不必每次都是相同的位置。
processUnsafeRawPointer(&key)是“in-out表达式”的情况。由于key是一个var,这将只传递var的位置,而不做任何其他事情。

相关问题