Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

강한 순환 참조(Strong Reference Cycle)는 어떤 경우에 발생하는지 설명하시오. #11

Open
heerucan opened this issue Sep 26, 2021 · 1 comment
Labels

Comments

@heerucan
Copy link

No description provided.

@heerucan heerucan added the ARC label Sep 26, 2021
@heerucan
Copy link
Author

heerucan commented Oct 10, 2021

두 개 이상의 객체가 서로 상호 소유를 할 경우에 강한 순환 참조가 생깁니다.

class ClassA {
	var objB: ClassB!
	deinit { print("A 객체 해제") }
}

class ClassB {
	var objA: ClassA!
	deinit { print("B 객체 해제") }
}
var a: ClassA! = ClassA()    // -> A 객체 R.C = 1
var b: ClassB! = ClassB()    // -> B 객체 R.C = 1

만약 여기서 끝난다고 해도 강한 순환 참조가 됩니다.
왜냐하면 ClassA와 ClassB 객체가 해제되지 않아 Reference Count가 1로 남아있기 때문입니다.

// 서로 객체 소유
**a.objB = b**    // -> B 객체 R.C = 2
**b.objA = a**    // -> A 객체 R.C = 2

여기서 ClassA 객체의 인스턴스인 a가 objB라는 프로퍼티를 통해서 ClassB 객체를 참조하고 있어 ClassB 객체의 R.C가 1 증가하고
ClassB 객체의 인스턴스인 b가 objA라는 프로퍼티를 통해서 ClassA 객체를 참조해 ClassA 객체의 R.C가 1씩 증가합니다.

a = nil    // -> A 객체 R.C = 1
b = nil    // -> B 객체 R.C = 1

nil을 대입해 해제하려고 해도 두 객체 모두 현재 R.C가 1씩 남아있기 때문에 객체가 해제되지 않는데
이 상황을 강한 순한 참조라고 합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant