Struct를 사용하면 메모리 관리에 민감하지 않아도 된다고 생각했다.
struct 안에서의 클로저 사용할 때 self를 참조해도 순환참조가 발생하지 않기 때문이다.
어느 순간 머릿속에서 struct 안에서는 포인터 참조를 걱정하지 않아도 된다고 착각하고 있었다.
그런데 이번에 문제가 생겼다.
바쁜 와중에 메모리 memory leak이 생겨버리니... 어이가 없기도 했고,
지금까지 제대로 모르고 있었다는게 부끄러워서 글로 작성해둔다.
이게 오히려 시간을 아끼는 길이길 바란다.
struct MyStruct {
let myClass: MyClass
}
class MyClass {
var myStruct: MyStruct?
}
let myClass = MyClass()
let myStruct = MyStruct(myClass: myClass)
myClass.myStruct = myStruct
https://stackoverflow.com/questions/42632122/retain-cycle-between-class-and-struct
아래의 스택오버플로우 링크에 있는 내용과 동일한데, 딱 이런 상황을 만들어서 사용했다.
struct가 class의 reference counting을 올린다는게 이해가 안갔다.
내가 이해한 바는 이렇다.
Class가 Struct를 강하게 참조하는데, Struct안에는 강한 참조가 되는 포인트가 있다.
Class는 그 포인트를 강하게 참조하게 되는데, 이 경우에 하필이면 자기 자신인 것이다.
그러니까 한 다리 건너서 자기 자신을 참조한 셈이다.
A -> B -> A
이런 경우 unonwed나 weak을 붙여서 고리를 끊어줄 수 있다.
struct라고 메모리 관리에 대해 생각을 내려 놓으면 안된다.
다음에는 struct에 대해 자세히 알아봐야겠다.
조금 더 공부할 거리
https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html