ARC(Automatic Reference Counting)의 동작방식

jeongmuyamette·2025년 2월 24일

TIL

목록 보기
51/72
post-thumbnail

두 가지 중요한 iOS 메모리 관리 관련 질문에 대해 자세히 답변하겠습니다.

1. ARC(Automatic Reference Counting)의 동작방식

ARC란?

ARC는 Swift와 Objective-C에서 메모리 관리를 자동으로 처리하는 시스템입니다. 컴파일 시점에 자동으로 retain/release 코드를 삽입하여 메모리를 관리합니다.

주요 동작 방식

  1. 참조 카운팅

    • 객체가 생성될 때 참조 카운트가 1로 시작
    • 새로운 참조가 생길 때마다 카운트 증가 (+1)
    • 참조가 해제될 때마다 카운트 감소 (-1)
    • 참조 카운트가 0이 되면 메모리에서 해제
  2. Strong Reference (강한 참조)

    class Person {
        var name: String
        init(name: String) {
            self.name = name
        }
    }
    
    var person1: Person? = Person(name: "John") // 참조 카운트: 1
    var person2 = person1 // 참조 카운트: 2
    person1 = nil // 참조 카운트: 1
    person2 = nil // 참조 카운트: 0, 메모리 해제
  3. Reference Cycle 방지 방법

    • weak 참조: 약한 참조로, 참조 카운트를 증가시키지 않음
    • unowned 참조: 미소유 참조로, 참조 대상이 항상 존재한다고 가정

면접 답변 포인트

  • ARC는 컴파일 시점에 동작하는 메모리 관리 시스템임을 강조
  • 수동으로 메모리 관리할 필요가 없어 개발자의 실수를 줄여줌
  • Reference Cycle 문제와 해결방안을 언급

2. Memory Leak (메모리 누수)

Memory Leak이란?

더 이상 사용되지 않는 메모리가 해제되지 않고 계속 남아있는 현상입니다.

주요 발생 원인

  1. 강한 참조 순환 (Strong Reference Cycle)

    class Parent {
        var child: Child?
    }
    
    class Child {
        var parent: Parent?
    }
    
    // 메모리 누수 발생
    let parent = Parent()
    let child = Child()
    parent.child = child
    child.parent = parent
  2. 클로저에서의 캡처 순환

    class ViewController {
        var completionHandler: (() -> Void)?
        
        func setupHandler() {
            // 메모리 누수 발생
            completionHandler = {
                self.view.backgroundColor = .red
            }
        }
    }

해결 방법

  1. weak, unowned 사용

    class Child {
        weak var parent: Parent? // weak 사용으로 순환 참조 해결
    }
  2. 클로저에서 캡처 리스트 사용

    completionHandler = { [weak self] in
        self?.view.backgroundColor = .red
    }

면접 답변 포인트

  • Memory Leak의 정의와 심각성 설명
  • 주요 발생 원인과 구체적인 예시 제시
  • 해결 방법에 대한 실제 코드 예시 제시
  • 디버깅 도구(Instruments)를 통한 탐지 방법 언급

이러한 개념들은 iOS 개발에서 매우 중요하며, 실제 앱 개발 시 성능과 안정성에 직접적인 영향을 미치므로 잘 이해하고 있어야 합니다.

0개의 댓글