gpt4 book ai didi

ios - Inout 参数没有相同的地址

转载 作者:可可西里 更新时间:2023-11-01 01:02:30 27 4
gpt4 key购买 nike

我有三个类 A、B 和 C。A 有一个名为 rA 的资源。我想要实现的是所有这些实例都引用了完全相同的资源。

所以用 Swift 术语具体来说:

A 类有一个名为 foo 的属性:

private var foo : [Bar] = [Bar]() // shared resource

B 类有一个名为 foo 的属性,它作为 inout 参数传递给初始化程序:

private var foo : [Bar]!
init(inout foo:[Bar]){
self.foo = foo
}

C 类类似于 B 类

为什么,如果我将 foo 从 A 类传递到 B(或 C)类,地址会发生变化?

在 A 中,我会像这样将它传递给 B(或 C):

let b = B(foo: &self.foo)

当我在 A 中初始化 foo 后打印地址时,它给我的地址与在 B 中分配后的地址不同。

class A{
private var foo = [Bar]()
func someFunc(){
NSLog("\n\n [A] \(unsafeAddressOf(self.foo))\n\n") // different from output in B
let b = B(foo: &self.foo)

}
}

class B{
private var foo: [Bar]!
init(inout foo: [Bar]){
self.foo = foo
NSLog("\n\n [B] \(unsafeAddressOf(self.foo))\n\n")
}
}

知道为什么会这样吗?

最佳答案

Swift 数组是值类型,因此在

self.foo = foo

您将foo 分配给self.foo。现在这是两个独立的数组(即使实际元素仅在其中一个数组发生变异时才被复制)。

此外,您不能使用 unsafeAddressOf() 获取 Swift 数组的地址,因为该函数采用 AnyObject 参数,该参数是一个类的实例,即值类型。在

 unsafeAddressOf(self.foo)

Swift 编译器实际上将 Swift 数组桥接到 NSArray。如图所示在 Swift, Strings and Memory Addresses ,当重复完成时,这可能会或可能不会导致相同的对象。任何状况之下,打印出来的地址不是Swift数组的存储位置。

如果您需要一个可以传递的真实引用,那么您可以将数组包装在一个类中。使用 NS(Mutable)Array 也可能是一种选择,但那样你会失去许多 Swift 特性。

关于ios - Inout 参数没有相同的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34211831/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com