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