Swift 3 中是否有类似于 C++ 的 shared_ptr 的等效物?

4
我知道Swift 3中的强引用(默认)和弱引用(使用weak关键字),但是否存在类似于共享引用的等效方法呢?
谢谢。

1
我不太了解C++,所以你能否解释一下共享引用的行为,以便更多的人可以回答这个问题? - Sweeper
3个回答

4
Swift中的内存管理范式与C++不同,因为它继承了Objective-C的保留-释放机制(通过ARC)。正如你所期望的那样,C ++ 的解决方案使编译器的责任更轻,更具表现力和优化性,但处理起来也更加复杂。
因此,回答您的问题:strong(默认)基本上像shared_ptrweak就像weak_ptr,而unique_ptr没有直接等价物。然而,如果编译器能够保证指针的唯一性(例如,在同一作用域内创建和销毁对象 - 如函数体 - 而不将其分配给任何变量),则某些强变量可能会像unique_ptr一样。
当然,这仅适用于引用类型。值类型只是被复制。

在 Swift 中是否有指令或函数可以告诉我们一个变量是引用类型还是值类型? - Bob5421
2
如果该值可以转换为 AnyObject,则它是引用类型。否则,它是值类型。(在 Swift 中,“value is AnyObject”) - Sealos

4

Swift应用自动引用计数(ARC)来确定何时释放由引用类型实例使用的内存(即当指向该对象的强引用数量为零时)。ARC和其引用计数运行自动化,但其与显式使用C++的std::shared_ptr存在相似之处;后者将允许指向对象(由共享指针)仅在所有智能指针指向该对象的作用域已经结束或被显式重置(/nulled)(例如通过提供删除器)时被销毁。

在上面的示例中,您可以将强不变量(引用)foobar(后者从foobar()返回)视为C++的std::smart_ptr的等价物:它们都指向相同的Foo对象,只有当两者都超出作用域时,对象才会被去初始化。

class Foo {
    init() { print("initializing") }
    deinit { print("deinitialized") }
}

func foobar() -> Foo {
    let foo = Foo() // strong reference
    let bar = foo   // another strong reference 
    // total "shared" count is now 2
    return bar
    // reference associateced with 'foo' goes 
    // out of scope, but the reference associateced
    // with 'bar' is returned from the function, and
    // thus, ARC still keeps the Foo instance alive.
}

func bar() {
    print("calling foobar ...")
    let bar = foobar() // retains the reference from 'bar' in foobar()
    print("foo() is now out of scope")
    print("leaving bar() scope ...")
} // 'bar' of bar() goes out of scope: Foo object should be deinitialized

bar()
/* calling foobar ...
   initializing
   foo() is now out of scope
   leaving bar() scope ...
   deinitialized             */
/* ^^^^^^^^^^^^^- ok */

2

普通的变量(没有弱引用或无主引用修饰符)与shared_ptr有着类似的语义。


我认为普通变量是强引用。 - Bob5421
@Bob5421 是的,但指针保存了持有引用计数的人的引用,并且当计数器达到零时被删除,与shared_ptr相同。 - Sealos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接