lunchScreen/Interview_Questions

Strong 과 Weak 참조 방식에 대해 설명하시오.

Opened this issue · 5 comments

Strong 과 Weak 참조 방식에 대해 설명하시오.

인스턴스 선언시의 기본값인 Strong은 인스턴스를 직접 소유하는 강한 참조 방식으로 참조시에 참조 횟수가 1증가합니다.
Weak은 인스턴스의 주소값만을 가지고 있는 약한 참조 방식으로 참조횟수가 증가하지 않습니다.

Strong은 강한 참조, Weak는 약한 참조를 말합니다. 강한 참조는 해당 객체를 소유하고 있음을 의미하기 때문에 ARC의 reference count가 1 증가합니다. 하지만 약한 참조는 소유권없이 참조만 하고 있는 것이기 때문에 reference count가 증가하지 않아 ARC에 영향을 주지 않습니다. 참조시 기본값은 Strong입니다.

Unowned도 Weak과 비슷한 약한 참조입니다. Unowned는 해당 인스턴스가 메모리에서 사라질 일이 없다고 확인하여 nil이 될 경우 에러가 발생합니다. (즉 Weak는 옵셔널인 반면 Unowned는 옵셔널이 아닙니다.)

Strong(default)은 인스턴스가 생성될 때 자동으로 RC 가 증가하는 것을 말합니다. 하지만 Stong의 문제점도 존재합니다. 이는 순환참조로, 서로가 서로를 참조하고 있는 인스턴스가 발생해 RC 가 0이 되지 못해 메모리 해제가 되지 않는 문제입니다.

이를 해결하기위한 방법으로는 Weak 과 unowned 이 있습니다.
Weak 은 인스턴스를 참조할 때 RC 를 증가시키지 않아 인스턴스가 할당 해제될때 해당 인스턴스를 약한 참조하는 프로퍼티를 nil로 초기화합니다.

unowned 는 인스턴스를 참조하는 도중에 해당 인스턴스가 메모리에서 사라질 일이 없다고 확신을 할 떄 사용하는 방법으로 unowned 으로 선언된 변수가 가리키던 인스턴스가 먼저 해제 된다면 에러를 발생할 수 있다는 위험성이 있습니다.

Strong은 강한참조이고 Weak은 약한 참조입니다.

Strong은 default값으로 Strong으로 참조하게 되면 그 객체를 직접 가지고 있게 되어서 Reference count가 증가하게 됩니다. Weak으로 참조하게 되면 직접 가지고 있는 것이 아닌 주소값을 참조하게 되어서 Reference count가 증가하지 않습니다. 따라서 Weak은 순환 참조를 해결하기 위해서 사용할 수 있습니다.

Strong 참조는 기본값이며 할당시 Reference Count가 1 증가하고 해제시 1 감소합니다. 객체의 Reference Count가 0이 되면 할당이 해제되는데, 여러 객체가 서로를 참조하고 있어 할당이 해제되지 않는 경우가 발생하고 이를 순환참조라고 합니다. 순환참조가 발생하면 메모리 누수가 생기므로, 이를 방지하기 위해 Weak 또는 Unowned 참조를 사용해야 합니다.

Weak 참조는 객체의 Reference Count 계산에 포함되지 않고, 객체의 할당이 해제되었을 때 nil을 반환하여 순환참조를 해결할 수 있습니다. 하지만, life cycle에 의한 다양한 문제가 발생할 수 있어 Optional Binding, withExtendedLifetime(), Strong 참조 접근으로 재설계, 내부 class 정보에 가시성을 제한하는 설계를 해야할 필요가 있습니다.