해결된 질문
작성
·
280
0
강의에서 보면 경쟁상황에 의해 testVar 변수가 여러개 생긴 상황이 발생하는 것으로 보입니다!
그렇다면, 예를들어 강의 4:22에서 들어준 예시와 같이 testVar 변수가 세개 생겼다고 가정하고 이를 a,b,c 라고 이름 붙이고, a,b,c 순서로 변수가 생성되었다고 할 때 궁금한 점이 있습니다.
Q. 최종적으로 인스턴스가 가지게 되는 프로퍼티는 c인가요?
-> 맞다면 나머지 a,b는 어디에 저장되는 것인지, 인스턴스가 메모리에서 해제되면 a,b는 해제되지 않을것 같은데 좀비로 남게 되나요??
-> 아니라면 a,b,c 중에 어떤 변수가 최종적으로 프로퍼티로써의 역할을 할 수 있나요?
답변 1
0
네 안녕하세요. 04fud27 님.
말씀하신대로 testVar 변수가 세개 생겼다고 가정하고 이를 a,b,c 라고 이름 붙이고, a,b,c 순서로 변수가 생성되었다고 하면, 반드시 c는 아닙니다. (인스턴스가 클래스라고 가정하면) 인스턴스 내부에 실제 메모리가 생성되어서 힙(Heap) 메모리에 올라가는 시점이 있고, a, b, c 중의 하나는 맞지만 반드시 마지막 것은 아닙니다. b 데이터(속성)가 힙에 올라가는 시점이어서 해당 인스턴스와 연결되었다면 b일수도 있습니다.
(순서가 보장되는 것도 아닙니다. 그래서 쓰레드 세이프 하지 않기 때문에 위험하다고 말하는 것이죠.)
컴파일 될때 lazy var 관련 데이터 생성 코드가 있고, 미리 힙에 올라가 있던 인스턴스와 이 데이터(속성) 간에 연결되는 것이 특정 시점과 연관이 있을 것이라고 생각되기 때문에 (lazy var 자체가 인스턴스 내부에 저장되는 데이터 일뿐이기 때문에 당연히 ARC하고도 관련이 있지않아) 나머지 데이터(속성)들은 좀비로 남을 것 같지는 않습니다.
(단순히 lazy var 관련 데이터들이 출력 등을 통해 생성시점에 확인해볼 수 있지만, 그렇다고 해서 출력된 것과 관련된 데이터들이 힙에 올라가서 지속적으로 존재한다는 것을 보장하지는 않습니다.)
말씀드린대로 a, b, c중에 lazy로 올라간 데이터(속성) 중에 특정한 것이라고 (항상 동일성을) 보장할 수는 없습니다. a, b, c중에 한가지라는 것은 알 수 있죠. 반복문 후에 쓰레드를 잠시 잠재우시거나 한 후에 출력해보시면.. 그때는 특정 데이터만 남아있는 것을 확인해 보실 수 있습니다.
감사합니다. :)
네 답변 감사합니다 :)