-
[iOS]Retain Cycle이 무엇인가? ( ARC,MRC)카테고리 없음 2022. 9. 14. 13:49
일단 정신을 바짝 차려한다.
이것이 무엇인지 알려면.. ARC, MRC 까지 알아야하니까!
Retain Cycle는 결론만 말하면
"연결 상태를 String, Weak, unowned로 각각의 상황에 따라서 약하게 연결할지 강하게 연결할지를 결정하는 것"이라고 말할 수 있다.
이게 뭐냐고 하면..메모리 관리 기술에 관한건데..
그럼 메모리 관리기술은뭔데?
메모리 관리는 왜하는데?
까지 생각이 들어갈 수 있으므로 하나하나 이야기를 해보겠다.
우리의 자원인 메모리는 한정적이다 ( RAM 8G ) 이렇게 한정적이다.
우리는 한정적인 자원을 사용해서 프로그램을 사용해야하고 동작해야한다.
왜냐면 메모리가 많아지면 컴퓨터는 많은 양을 가지고 있기 때문에 느려지고, 어느정도 이상 메모리를 사용하게되면 핸드폰 내에서 다른 앱들을 보호 하기위해 그 앱을 꺼버리기 떄문이다.
느려진다, 앱이 꺼진다 라는 현상은 사용자 이탈과 서비스제공이 원할하지 않는 문제를 초래하므로 문제가 되는 상황이다.
( 은행어플에서 송금하는데만 5분이 걸린다면 ... 끔찍! 근데 하다가 꺼져서 다시해야되... 그럼 난 그 어플 지울꺼같다 ㅋㅋㅋ)
그래서 우리는 메모리 관리를 해야한다!
왜 이러한 형상이 생겨나는가?
쓸모없는 메모리를 가지고있다. -> 메모리가 새고 있다.
이것을 우리는 메모리 닉(메모리 누수) 현상이라한다.
이 현상을 막아 줄 수 있는 애!!!
메모리 릭 현상을 자동으로 막아주는 게 ARC(AUTO REFERANCE COUNTION)다.
ARC도 갑자기 생겨난 애가 아닌데
ARC가 나타나기전에 MRC(Menual Reference Coution)가 있었다.
MRC는 Objective-C 시절에 메모리 관리를 했던 애로 "참조한 갯수를 새서 관리"하는 애다.
레퍼런스란?
$1234주소값이 존재하는 메모리 공간에 이름을 부여하는 행위
var aaa :Int // int길이의 메모리공간을 주세요. 그이름은 aaa라고 부를꺼에요.어떤 레퍼런스를 참조하였다면 참조 당한 레퍼런스를 코드로 retain 해주고 참조값을 +1
그 레퍼런스가 Nil값이 되거나 쓸모없어 졌다고 생각하면 Release라고 써주고 참조값을 -1 해주는 거다.
예를들어
fun aa {
let c = 1 // [retain +1]
b = c // [release -1]
}
void main {
var b = 0 // [retain +1]
aa()
}
[release -1]
retain.vale = 2
release.value = -2
짝갯수가 맞으면 메모리 누수가 없다는 것으로 판단하는거다!!
쪼아!!
그럼 MRC가발전한 거라면 ARC는 문제!!
이 참조한 갯수를 세서 관리하는 애를 자동으로 해주는 것!
오케이 그럼?! 자동으로 관리해주는데
굳이?? 왜?? 잘되고 있는거아니야? 할 수 있다.
근데 얘가 원리 원칙인애라서 레퍼런스가 참조당할떄 +1 그 인스턴스가 쓸모없어졌다고 판단 될때만 -1를 하기떄문에 문제가 발생한다.
왜?? 아니...
만약! 서버와 통신을 하는데
10초가 지났는데도 연결이 안되면 이제 그만~ 하고 기다림의 메모리를 다른 쪽에서 사용할 수 있게 헤제 시켜줘야하는데
(데이터를 주세요~ 라는 연결이 쓸모없다고 판단되지 않으면 그것은 계속 잡고 있기떄문에 ...근데 사용자는 10 초 지났자나!! 필요없는거라구~~~ 이렇게 이런느낌? 그래서 메모리 누수가 있다 )
https://fomaios.tistory.com/entry/%EB%A6%AC%ED%85%8C%EC%9D%B8-%EC%82%AC%EC%9D%B4%ED%81%B4