retain
reference count 증가를 통해 현재 scope에서 객체가 유지되는 것을 보장한다
release
reference count를 감소시킨다. retain 후에 필요없을 때 reslease를 한다.
complie time에 자동으로 retain, release를 적절한 위치에 삽입하는 방식으로 메모리를 관리한다.
이렇게 자동으로 retain, release를 삽입해서 관리를 하고 0이될 때 deinit을 호출해서 메모리를 해제시킨다.
메모리 관리는 Data, Heap, Stack, Code 이렇게 4가지 가상 메모리 영역중 Heap영역과 관련되어 있다
Heap은 Class, closure 등 참조형 자료들이 머무는 공간이자, 개발자가 동적으로 할당하는 메모리 공간이기 때문에 관리가 필요하다
관리를 하기 위해서 Heap영역에 참조형 자료들이 얼마나 참조되고 있는지 카운팅하고 이에따라 메모리를 항당 및 제거하면 된다
그리고 이것을 자동으로 해주는 것이 바로 ARC이다
ARC가 해주는건 retain과 releae를 자동으로 삽입해주는것 밖에 없다. 자동으로 삽입하는 방법을 우리가 조금 조절하고 싶을 때
우리가 원하는 방향으로 메모리 관리가 이루어지려면 ARC 에 명확한 힌트를 주어야 하기 때문이다
func makeClone(_ origin: Human) {
let clone = origin // ② RC : 2
}
let sodeul = Human(name: "Sodeul", age: 26) // ① RC : 1
makeClone(sodeul) // ③ RC : 1 함수가 종료되어 지역변수 clone이 스택에서 해제되는 순간 RC -1이 된다
var zoe = Human(name: "zoe", age: 24) // zoe의 RC : 1
var allie = Human(name: "allie", age: 22) // allie의 RC : 1
zoe = allie // zoe의 RC : 0, allie의 RC : 2
zoe에 allie의 값을 대입하게 되면 zoe의 RC는 -1, allie의 RC는 +1
zoe 변수에 저장된 주소값이 바뀌었으니 당연히 참조 카운트도 변하게 된다
zoe가 가리키던 인스턴스의 RC가 0이 되었으므로 메모리에서 해제된다
강한 순환참조
라고 한다옵셔널 타입의 변수
여야 한다영희가 먼저 죽는다 -> 철수의 girlFriend가 nil이 될 수 있다 -> 철수의 girlFriend를 weak으로 선언한다
po CFGetRetainCount(self)
final class 가 class 보다 성능이 좋다
일반 클래스는 Method Dispatch가 Dynamic 인데, 파이널 클래스는 Static이기 때문이다
https://sihyungyou.github.io/iOS-method-dispatch/
참고한 블로그
https://sujinnaljin.medium.com/ios-arc-뿌시기-9b3e5dc23814
https://babbab2.tistory.com/26?category=831129