메모리를 참조하는 방법

지니🧸·2023년 4월 9일
0

Swift

목록 보기
4/4

Strong - 강한 참조

  • 해당 인스턴스의 소유권을 가짐
  • 자신이 참조하는 인스턴스의 retain count를 증가시킴
  • 값 지정 시점이 retain이 되고 참조가 종료되는 시점에 release
  • default 값
  • RC 조정으로 ARC로 인한 메모리 해제를 피하고, 객체를 안전하게 사용하고 싶을 때

Weak - 약한 참조

weak var test = Test()
  • 포인터 개념: 해당 인스턴스의 소유권을 갖지 않고 주소값만 가짐
  • 객체가 nil일 수도 있기 때문에 접근할 때는 무조건 Optional 사용해야 함
  • 자신이 참조하는 인스턴스의 retain count를 증가시키지 않음
    • 그래서 release도 되지 않음
  • 자신이 참조는 하지만 weak 메모리를 해제시킬 수 잇는 권한은 다른 클래스에 있음
  • 메모리가 해제될 경우 자동으로 nil으로 초기화
  • retain cycle에 의해 메모리가 누수되는 문제를 막기 위해 사용

Unowned - 미소유 참조/약한 참조

unowned var test = Test()
  • 해당 인스턴스의 소유권 가지지 않음
  • retain count 증가시키지 않음
  • nil이 될 수 없음
  • Optional로 선언되면 안됨
  • 객체의 라이프사이클이 명확하고 개발자에 의해 제어 가능이 명확한 경우
    • weak Optional 대신 사용
    • 간결한 코딩

Weak vs. Unowned

Weak: 객체를 계속 추적하면서 객체가 사라지면 nil로 바꿈
Unowned:

  • 객체가 사라지게 되면 dangling pointer가 남음
    • Dangling pointer: 원래 바라보던 객체가 해제되면서 할당되지 않는 공간을 바라보는 포인터
  • 댕글링 포인터를 참조하면 crash > unowned은 사라지지 않을거라고 보장된 객체에서만 사용

순환참조

  • 서로가 서로를 소유해 절대 메모리 해제가 되지 않음
  • ARC가 메모리 관리를 해주지만 자칫 잘못하면 순환참조가 발생할 수 있음

(ex) Delegate 패턴: 일을 시키는 객체와 일을 하는 객체가 존재

vc.delegate = self

위 코드 등으로 순환참조(양방향 참조) 발생

  • ViewController2에서 ViewController2 객체를 만듦 > ViewController1이 ViewController2 소유
  • ViewController2의 delegate을 ViewController1로 연결해줌 > ViewController2가 ViewController1을 소유

해결방법: delegate에 weak 붙이기 > ViewController1만 ViewControlelr2 소유 > 순환참조 X

weak var delegate: FirstViewProtocol?

참고: [Swift] 메모리를 참조하는 방법 (Strong, Weak, Unowned)

profile
우당탕탕

0개의 댓글

관련 채용 정보