iJoom
Denovation Dev information
iJoom
전체 방문자
오늘
어제
  • 분류 전체보기 (29)
    • Swift information (5)
    • Deep Dive iOS (10)
    • Books (1)
    • Conference (1)
    • 알고리즘 풀이 (10)
    • 알고리즘 개념 및 Tool C++ (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Weak
  • iOS Structure
  • 알고리즘
  • EscapingClosure
  • SWIFT
  • Cocoa Touch
  • sceneWillResignActive
  • 자료형에러
  • applicationWillResignActive
  • decdoingError
  • 백준
  • Core OS
  • Core Services
  • 문자열
  • 순열
  • 완전탐색
  • permuation
  • C++
  • ARC
  • Swift Concurrency
  • sidetable
  • struct
  • MergeConflicts
  • unowned
  • ValuesCapturing
  • 캡처리스트
  • ios
  • Strong
  • 문자열압축
  • bj4344

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
iJoom

Denovation Dev information

ARC 시리즈 2 - SideTable
Swift information

ARC 시리즈 2 - SideTable

2021. 11. 4. 20:46

간단한 요약

SideTable은 Swift 4 이후로 weak 참조일 때 weak reference count에 상관없이

strong reference count가 0 이면 바로 deinit과 메모리 deallocated가 진행되게하는

성능향상을 위한 것!


 

먼저 weak 와 unowned 사용의 가장 큰 차이는 공식문서를 참고하자면, unowned는 참조하는 다른 인스턴스의 수명이 같거나 더 길 때 사용한다는 점입니다.

 

Swift 4 이후로는 더욱 차별점이 생겼습니다. 바로 weak 참조는 SideTable을 참조하여 strong reference count가 0이 되면 weak reference count에 상관없이 object deinit , memory deallocated 가 발생하게 됩니다.

 

unonwed는 직접 해당 객체를 참조합니다. 하지만 weak는 SideTable을 참조합니다.

이러한 차이 때문에unonwed는, strong reference count가 0이어도 dangling pointer를 남기게 됩니다.

weak는 객체가 파괴되고 완전히 메모리 또한 할당 해제됩니다.

 

                                      (밑에서 자세히 알아보겠습니다~)                                          

 

                        흠.. deinit이 되면 무조건 메모리가 해제된거아니야 ?                 

        Swift 4 이전에는 오브젝트는 사라져도 메모리가 해제되지 않는 경우가 있었습니다.

 

 

class User {
    let id: Int
    let email: String
}

위의 User Class를 강하게 참조하면 아래의 경우입니다.

User 클래스를 강한 참조

 

 

추가로 가정을 해보겠습니다. 위의 strong reference count 1을 가진 User Class를 추가로 약한 참조를 진행합니다. 그리고 조금 있다가 strong reference count가 0으로 감소합니다.

 

이러한 상황이면 바로 객체는 deinit 되지만, 해당 메모리는 해제가 되지 않습니다.

 

추후 런타임에서 좀비객체를 확인하여 weak reference count를 감소시키고 메모리 해제를 진행합니다. 따라서 좀비 객체가 짧게 혹은 오래 살아있을 가능성이 생깁니다.

 

weak 참조 이후, strong reference count 감소된 경우 가정

 

그래서, strong referece count가 0이 되면바로 객체 deinitialized가 되며 메모리 해제 deallocated가 진행 되도록 SideTable의 개념이 Swift 4 부터 생겼습니다.

 

 

strong, unowned 참조는 객체를 직접 참조합니다.

weak 참조는 객체의 SideTable(옵셔널)을 참조합니다.

SideTable은 옵셔널 이며, weak 참조인 경우에 생기게 됩니다.

 

위와 같이 strong reference count가 0이 되면, 즉시 object deinit 과 메모리 deallocated가 진행됩니다 !

이러한 방법으로 Swift는 SideTable을 이용하여 좀비 객체를 만들지 않으며 메모리를 deallocated 합니다 !

 

참고: https://maximeremenko.com/swift-arc-weak-references

 

'Swift information' 카테고리의 다른 글

우아한 Model Data 처리 (1)  (0) 2022.06.11
클로저 - Capturing Values와 ARC  (0) 2021.12.03
ARC 시리즈 1 - Retatin Cycle 과 Reference Count  (0) 2021.11.02
Struct와 Class에서의 let 과 var의 차이에 대하여  (0) 2021.11.02
    'Swift information' 카테고리의 다른 글
    • 우아한 Model Data 처리 (1)
    • 클로저 - Capturing Values와 ARC
    • ARC 시리즈 1 - Retatin Cycle 과 Reference Count
    • Struct와 Class에서의 let 과 var의 차이에 대하여
    iJoom
    iJoom

    티스토리툴바