develop

ARC, 순환참조, 캡쳐 본문

iOS

ARC, 순환참조, 캡쳐

pikachu987 2021. 7. 13. 14:38
반응형

ARC

 

프로퍼티, 상수, 변수등을 참조하면 레퍼런스가 카운트가 올라가고

참조가 끝나면 레퍼런스 카운터가 내려가고

레퍼런스 카운터가 0이되면 메모리에서 해제한다.

 

자동 레퍼런트 카운터는 더 이상 사용되지 않는 시점을 결정하여 메모리를 해제한다.

 

그리고 ARC는 compile time에 코드 분석을 통해 적절한 위치에 retain, release 등의 코드를 삽입해 주고

삽입된 코드는 run time에 실행이 된다

 

옛날 MRC는 개발자가 직접 리테인과 릴리즈를 해줘야 했고

retain, release를 통해 referenceCount를 증감시키다가 count 가 0이 되면 deinit 을 통해 해제를 하였다.

이러한 작업을 ARC는 자동으로 해준다.

 

순환참조


메모리가 제대로 해지되지 않는 경우가 있고 순환참조라고 부른다.

1. 두 클래스 인스턴스의 프로퍼티가 서로를 강한 참조할 경우

2. 클로져 내부에서 객체를 참조할 경우

 

해결방법은

1. weak 약한참조

2. unowned 미소유 참조

 

weak와 언노운은 레퍼런스 카운트를 증가시키지 않으며 대상객체에 대한 참조가 가능한 점은 동일하지만 객체가 해제된 경우에 다르다.

 

unowned는 옵셔널이 아닌 경우 확실히 있는 경우에만 사용한다.

만약 객체의 메모리가 해제된 경우 unowned에 접근하면 bad access에러가 난다.

weak 같은 경우는 메모리가 해제 된 경우 nil이 나온다.

 

캡쳐

 

[weak self] in 이나 [unowned self] in 를 캡쳐리스트라고 한다. self를 캡쳐한다.

Swift에서는 capture를 사용하지 않으면 reference capture가 일어난다.

(struct로 만들어진 객체 변수도 레퍼런스 카운터가 올라간다.)

Capture를 사용하면 value copy가 된다.

[weak self, weak viewController, weak label] 이렇게 사용할수 있다.

 

반응형

'iOS' 카테고리의 다른 글

Autorelease Pool을 사용해야 하는 상황  (0) 2021.07.14
hugging, compression resistance에 대해서  (0) 2021.07.12
frame과 bounds의 차이  (0) 2021.07.11
Hashable에 대해  (0) 2021.06.23
==과 ===의 차이, closure의 ===  (0) 2021.06.22
Comments