개발하는 동글 :]

[TIL],[Swift],[Delegate의 Strong Reference Cycle] 본문

카테고리 없음

[TIL],[Swift],[Delegate의 Strong Reference Cycle]

동글하다 2023. 9. 19. 23:18

1. 문제 상황

개인과제를 진행하던 중 viewController가 deinit이 되지 않는 문제가 발생하였다.
무엇인가가 강한 참조순환이 되고 있어서 메모리에서 해제되지 않는 것이라고 판단하였다
그렇기에 처음으로 한 시도는 viewController을 사용하는 클로저에 모두 [weak self]를 붙이기 시작하였다.
그럼에도 viewController은 메모리에서 해제되지 않았기에 어떤 부분에서 강한 참조순환이 생기는지 찾기 시작하였다

2. 그래서 어디서 발생하는가?

class ToDoListCell: UITableViewCell {
	var cellDelegate: ButtonTappedDelegate?
}
extension ToDoListViewController: UITableViewDelegate, UITableViewDataSource{
	func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = myTableview.dequeueReusableCell(withIdentifier: ToDoListCell.identifier ,for: indexPath) as? ToDoListCell else { return UITableViewCell() }
        let tasks = Array(viewModel.getToDoList().reversed())
        cell.cellDelegate = self
        cell.bind(task: tasks[indexPath.row])
        return cell
    }
}
바로 이 부분에서 강한 참조 순환이 일어나고 있다.
이 부분의 관계를 그림으로 그려서 쉽게 이해해 보자.

그림과 같이 뷰 컨트롤러와 cell의 delegate가 서로를 강하게 참조하여 강한 참조순환이 일어나고 있었다.

3. 해결 방법

해결 방법은 기존의 강한 참조 순환 해결방법과 동일하다
뷰 컨트롤러를 강하게 참조하던 cellDelegate를 약한 참조로 수정해 주면
서로를 강하게 참조하고 있지 않기 때문에 강한 참조 순환을 해결할 수 있다.
weak var cellDelegate: ButtonTappedDelegate?

4. TIL

4.1오늘의 회고

1. 어제 발견하였던 메모리 누수의 문제점을 찾았고 그 부분을 해결해 보았다

2. 스터디 모비딕에서 진행하는 프로젝트의 UI를 구현

4.2 내일의 목표

1. Generics에 관한 부분을 공부하는 것을 하지 않았기에 조금 더 Generics의 활용과 다양한 문법을 공부해 보자.

2. 프로토콜과 Enum까지..!