堆内存管理
自动引用计数 (ARC)
在编译期间自动向Swift中间语言(sil)中插入引用计数语句,当引用计数为0的时候释放堆内存
class C {
let a: Int
init(a: Int) {
self.a = a
}
}
let c = C(a: 1)
sil: strong_retain c : $C
let c2 = c
sil: strong_retain c : $C
let c3 = c
sil: strong_release c : $C
sil: strong_release c : $C
sil: strong_release c : $C
循环引用
class A {
weak var b: B?
}
class B {
let a: A
init(a: A) {
self.a = a
}
}
let a = A()
let b = B(a: a)
a.b = b
class C {
var closure: () -> Void = {}
init() {
closure = { [weak self] in
let a = self
}
}
}
let c = C()
所有权 (Ownership)
在编译期间根据所有权规则向Rust中间表示层(mir)中插入drop语句,调用drop时释放堆内存
#![allow(unused)] fn main() { struct C { a: i32, } let c = Box::new(C { a: 1 }); let c2 = c; mir: c2 = move c; let c3 = c2; mir: c3 = move c2; mir: drop(c3); }
循环引用
#![allow(unused)] fn main() { struct A { b: Option<Weak<B>>, } struct B { a: Rc<RefCell<A>>, } let a = Rc::new(RefCell::new(A { b: None })); let b = Rc::new(B { a: Rc::clone(&a) }); a.borrow_mut().b = Some(Rc::downgrade(&b)); }