我知道Swift 3中的强引用(默认)和弱引用(使用
谢谢。
weak
关键字),但是否存在类似于共享引用的等效方法呢?谢谢。
strong
(默认)基本上像shared_ptr
,weak
就像weak_ptr
,而unique_ptr
没有直接等价物。然而,如果编译器能够保证指针的唯一性(例如,在同一作用域内创建和销毁对象 - 如函数体 - 而不将其分配给任何变量),则某些强变量可能会像unique_ptr
一样。Swift应用自动引用计数(ARC)来确定何时释放由引用类型实例使用的内存(即当指向该对象的强引用数量为零时)。ARC和其引用计数运行自动化,但其与显式使用C++的std::shared_ptr
存在相似之处;后者将允许指向对象(由共享指针)仅在所有智能指针指向该对象的作用域已经结束或被显式重置(/nulled)(例如通过提供删除器)时被销毁。
在上面的示例中,您可以将强不变量(引用)foo
和bar
(后者从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 */
普通的变量(没有弱引用或无主引用修饰符)与shared_ptr有着类似的语义。