Skip to content

ARC and Weak Refs

Class instances are heap allocated with new and managed with ARC.

global var destroyed: Int = 0;
class Buffer {
fun deinit() {
destroyed = destroyed + 1;
}
}

When the last strong reference disappears, deinit() can run immediately.

Use weak to avoid reference cycles:

class Parent {}
class Child {
priv parent: weak Parent;
pub fun setParent(parent: weak Parent) {
self.parent = parent;
}
}

Zap also supports:

  • alive(weakRef)
  • lock(weakRef)
class Parent {
pub fun current() Int {
return 7;
}
}
class Child {
priv parent: weak Parent;
pub fun setParent(parent: weak Parent) {
self.parent = parent;
}
pub fun readParent() Int {
if !alive(self.parent) {
return -1;
}
var parent: Parent = lock(self.parent);
return parent.current();
}
}