堆内存管理

自动引用计数 (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));
}