본문 바로가기

iOS

강한순환참조

728x90
반응형
SMALL

iOS에서 강한 순환 참조가 발생하는 경우는 대부분 컨트롤러나 , 델리게이트 등에서 발생합니다. 이러한 상황에서는 메모리 누수 문제가 발생할 있으므로, 강한 순환 참조를 해결해야 합니다.

 

강한순환참조 코드예제

class ViewController: UIViewController {
    var model: Model?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        model = Model()
        model?.delegate = self
    }
}

class Model {
    var delegate: ViewController?
    
    func updateData() {
        delegate?.updateView()
    }
}

위 코드에서는 ViewController 클래스와 Model 클래스가 서로를 참조하고 있습니다.

- ViewController 클래스는 Model 객체를 생성

- Model 클래스는 ViewController 객체를 델리게이트로 참조

 

 이러한 상황에서는 ViewController 객체가 해제되어도 Model 객체가 계속해서 ViewController 객체를 참조하게 되어 메모리 누수 문제가 발생할 수 있습니다.

강한 순환 참조를 해결하는 방법으로는 약한 참조(weak reference) 사용하는 것입니다.

예제 코드에서는 delegate 프로퍼티를 weak 선언하여 ViewController 객체를 약한 참조하도록 수정할 있습니다.

 

delegate 프로퍼티를 weak 선언하여 ViewController 객체를 약한 참조하도록 수정한 코드 예제

class ViewController: UIViewController {
    var model: Model?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        model = Model()
        model?.delegate = self
    }
    
    func updateView() {
        // update view
    }
}

class Model {
    weak var delegate: ViewController?
    
    func updateData() {
        delegate?.updateView()
    }
}

이제 ViewController 객체가 해제되면 Model 객체도 함께 해제되므로, 메모리 누수 문제가 발생하지 않습니다.

728x90
반응형
LIST

'iOS' 카테고리의 다른 글

iOS UDP 통신 쉬운 예제 코드  (0) 2023.04.30
TCP, UDP  (0) 2023.04.29
AppDelegate  (0) 2023.04.27
ViewController Life Cycle  (0) 2023.04.27
iOS 면접 질문  (0) 2023.04.26