Cheatsheet Swift - Memory Model

May 26, 2019
swift cheatsheet

Memory Model

This cheat sheet for Swift 5 contains information on how memory is allocated and released. It’s important to understand this aspect as Swift doesn’t have a GC but instead relies on automatic reference counting something akin to Smart Pointers in C++.

By Reference

class A {
    var data: Int = 0
}

func main(){
    var a = A()
    var b = a
    a.data = 1
    b.data = 2
    print(a.data)
    print(b.data)
}


print("Start")
main()
print("Finish")

Start
2
2
Finish

By Value

struct A {
    var data: Int = 0
}

func main(){
    var a = A()
    var b = a
    a.data = 1
    b.data = 2
    print(a.data)
    print(b.data)
}


print("Start")
main()
print("Finish")

Start
1
2
Finish

Strong Reference - Cyclic Leak

class A {
    var b: B?
    init(){
        self.b = nil
        print("Create A")
    }
    deinit {
        print("Destroy A")
    }
}

class B {
    var a: A?
    init(){
        self.a = nil
        print("Create B")
    }
    deinit {
        print("Destroy B")
    }
}
func main(){
    var a = A()
    var b = B()
    a.b = b
    b.a = a
}


print("Start")
main()
print("Finish")

Start
Create A
Create B
Finish

Break Cycle - Weak Reference/Unowned Reference

class A {
    var b: B?
    init(){
        self.b = nil
        print("Create A")
    }
    deinit {
        print("Destroy A")
    }
}

class B {
    weak var a: A?
    init(){
        self.a = nil
        print("Create B")
    }
    deinit {
        print("Destroy B")
    }
}
func main(){
    var a = A()
    var b = B()
    a.b = b
    b.a = a
}

print("Start")
main()
print("Finish")

Start
Create A
Create B
Destroy A
Destroy B
Finish

class A {
    var b: B?
    init(){
        self.b = nil
        print("Create A")
    }
    deinit {
        print("Destroy A")
    }
}

class B {
    unowned var a: A?
    init(){
        self.a = nil
        print("Create B")
    }
    deinit {
        print("Destroy B")
    }
}
func main(){
    var a = A()
    var b = B()
    a.b = b
    b.a = a
}

print("Start")
main()
print("Finish")

Start
Create A
Create B
Destroy A
Destroy B
Finish

comments powered by Disqus