이것저것 적어보는 블로그

Swift Strong과 Weak 그리고 Unowned 본문

개발&코딩/Swift

Swift Strong과 Weak 그리고 Unowned

dona0408 2022. 10. 9. 23:54
반응형

iOS App을 개발하다보면 Strong과 Weak이란 키워드가 쓰이는걸 볼 수 있다. 이 두가지는 메모리 회수 정책과 관련이 있다.

먼저 메모리 관리인 ARC에 대해 알아보면


ARC (Automatic Reference Counting)

자동으로 메모리를 관리해주는 방식을 말한다. 컴파일 시점에 동작하며 참조 카운팅이 0이 될때만 메모리에서 해제한다.
클래스의 새로운 인스턴스를 만들 때 ARC는 인스턴스의 정보를 저장하기 위해 메모리를 할당하며
ARC는 인스턴스가 더 이상 사용되지 (참조 카운팅 0) 않는다고 판단하면 메모리를 해제한다.
레퍼런스 프로퍼티에 인스턴스를 할당하면 ARC는 참조되는 프로퍼티의 갯수를 카운팅하여 참조하는 모든 변수가 인스턴스를 해제하기 전에 ARC는 인스턴스를 메모리에서 해제하지 않는다.

 

strong : 레퍼런스 카운트를 증가시켜 ARC로 인한 메모리 해제를 피하고, 객체를 안전하게(Safe) 사용하고자 할 때 쓴다.
다른곳에서 참조하고 있을 경우 앱이 종료되기 전까지 메모리에서 제거되지 않아 메모리 누수(Memory Leak) 발생 가능
값 지정 시점에 retain이 되고 참조가 종료되는 시점에 release가 된다.

 

weak : 레퍼런스 카운트를 증가시키지 않는다.
retain cycle에 의해 메모리가 누수되는 문제를 막기 위해 사용되며, iOS Framework에서 대표적인 예시로 delegate 패턴이 있다.
객체를 소유하지 않고 주소값만을 가지고 있는 포인터 개념으로 자신이 참조는 하지만 weak 메모리를 해제시킬 수 있는 권한은 다른 클래스에 있다.
retain이 발생하지 않므으로 release도 발생하지 않아 언제 어떻게 메모리가 해제될 지 알 수 없다.
다만 메모리가 해제될 경우 자동으로 레퍼런스가 nil로 초기화 해준다.
그렇게 때문에 weak속성을 사용하는 객체는 항상 Optional 타입이어야 한다.

 

unowned : Swift 5.0부터 추가. weak과 동일하게 레퍼런스 카운트를 증가시키지 않는다.
객체의 lifecycle이 명확하고 개발자에 의해 제어가 확실한 경우, weak 대신 사용하여 좀 더 간결한 코딩이 가능하다.
weak과 비슷한 역할을 하지만 unowned로 선언된 변수는 nil이 될수가 없다.

객체가 ARC에 의해 메모리 해제가 되더라도, 해당 객체 값을 존재하는 것으로 인지하며, 해당 객체에 액세스 할 경우 런타임 오류를 발생시키기 때문.
그러므로 unowned 변수는 옵셔널 선언하면 안되며 해제된 메모리 영역을 접근하지 않는다는 확실한 경우에만 사용해야한다.

 

참고 블로그

반응형

'개발&코딩 > Swift' 카테고리의 다른 글

Swift 옵셔널(Optional)  (0) 2022.12.12
Swift 변수명 규칙  (0) 2022.10.08
Swift 함수 기본 문법  (0) 2020.12.27
Comments