반응형
Memory Management
ARC(Auto Reference Counting)
- Reference Type (Heap memory에 저장) => 자동으로 관리 (참조 포인터 수를 counting.. 그 수가 0이 되면 toss.. Garbage Collection 기법과는 다름)
> Garbage Collection : 힙 메모리를 간헐적으로 관찰하여 참조하지 않으면 날리는 방식 -> 예측 불가능한 불규칙한 메모리 정리
Influencing ARC
- strong ( default )
기본적인 Reference Counting 방식
해당 포인터가 더 이상 해당 메모리를 참조하지 않을 때까지 힙 메모리 안에 머물도록 - weak
힙에 있는 것을 사용하지 않는 다면, 힙에서 제거 후 nil로 설정 ( : optional pointer 여야 함 )
> Outlet : 뷰 계층에 따라 힙에 저장하기 때문에상위 뷰의 UILabel에 대해 strong 포인터를 가지고 있으므로 weak pointer로 heap에 넣어두지 않아도 됨. 그러나 해당 뷰 계층이 UILable을 제거해버린다면, 더 이상 뷰의 일부가 아니라면, Outlet은 nil로 설정 됨 - unowned
참조 횟수를 추적하지 않겠다. 즉, 해당 포인터를 더 이상 사용하지 않을 때까지 메모리의 특정 공간을 항상 가리킴. 만약, 참조한 것이 힙 밖으로 버려지면, 더 string pointer는 존재하지 않게됨. => Crash!
Closures (inline function)
- 주변에 있는 범위 안의 모든 변수를 참조할 수 있음. inline 함수이기 때문에, 함수 안에서 모든 지역 변수(instance 변수, property .. )들을 참조할 수 있고, 읽고 변경할 수 있음
- heap 메모리에 저장 ( : 기본적으로 reference type )
capturing
- 클로저 안에서 캡쳐가 된 모든 변수들은
이미 힙 안에 있다면 클로저로 부터 strong 포인터를 갖고 그렇지 않으면, 힙으로 옮김. ( 즉, 모든 것이 힙 안에!! )
지역변수를 넣은 클로저 중 하나의 지역변수를 캡처하면, 그 지역변수들 역시 힙에 보관 됨. ( 해당 클로저가 힙에 머물 때까지 )
https://devxoul.gitbooks.io/ios-with-swift-in-40-hours/content/Chapter-3/functions-and-closures.html
- Memoty Cycle..
한 객체를 가리키는 클로저가 있고, 그 객체는 다시 클로저를 가리키는 상황. 즉, 서로 서로 strong 참조 관계에 있는 상황. 이 메모리는 힙에서 해제될 수 없음.- 메모리 순환을 깨려면?
unowned 키워드로 참조 수를 카운팅 하지 않도록 설정! => me 에 대한 strong 포인터를 만들지 않기에 self에 대한 strong 포인터도 생성되지 않음. 오직 self만이 strong하게 클로저를 가리키고 있을 뿐.
만약, 클로저가 ViewController보다 메모리에 오래 남아 있어, ViewController가 사라진 후에도 동작하여 한다면, me가 가리키는 ViewController는 heap 메모리에 존재하지 않으므로 crash 발생...
즉, weak로 설정!! weak 는 아무것도 힙 메모리에 저장하지 않음. optional type의 UIViewController가 됨.
- 메모리 순환을 깨려면?
- optional chaining
self?.--- : optional 변수 뒤에 ? 키워드를 붙이면, 만약 ?가 붙은 어떤 optional 변수가 nil이라면 그 뒤에 오는 모든 코드를 무시하라.
이제는 self가 nil이면 해당 밖으로 빠져나오고, 해당 ViewController가 힙에 존재하지 않더라도 해당 코드는 실행되고, weak 키워드로 해당 ViewController를 힙에 저장하지 않기에 메모리 순환도 일어나지 않음.
반응형