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

标签 ios swift pass-by-pointer inout

我有三个类 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/

相关文章:

c++ - C++ 是通过值还是引用传递对象?

c++ - 通过引用或指针正确传递 vector

iphone - 为应用程序制作主页 View

ios - Realm 对象服务器最实惠的选择?

SwiftUI - 类型 '[Color]' 的值没有成员 'identified'

ios - 如何滑动 1 UITableView 和 UICollectionView

ios - 了解 "For In"循环代码

iphone - iphone map View 上的热图....?

ios - 加密通过 Core Data 访问的 Sqlite 数据库