1. 강한 참조 Strong Reference
기본값
스위프트에서 모든 참조는 기본적으로 strong입니다. 즉, 클래스 인스턴스를 다른 변수를 할당하면, 그 변수는 해당 인스턴스를 <강하게> 참조하게 됩니다.
동작방식
강한 참조는 참조된 객체의 <참조횟수 Reference Count>를 증가시킵니다.
이 참조 횟수가 0이 되면 해당 객체는 메모리에서 해제됩니다.
장점
객체가 강한 참조를 받으면 메모리에서 해제되지 않고, 필요한 동안 유지됩니다.
문제점
잘못 사용하면 <강한 참조 사이클 Strong Reference Cycle>이 발생할 수 있습니다.
이것은 두 객체가 서로를 강하게 참조하여 참조횟수가 0이 되지 않아서 메모리에서 해제되지 않는 문제를 일으킵니다.
이것은 메모리 누수를 초래할 수 있습니다.
사용시기
객체의 생명 주기를 관리할 때, 즉 객체가 살아있는 동안 계속 유지되어야 할 경우에 사용합니다.
예를 들어서, 뷰 컨트롤러가 가지고 있는 모든 UI요소들은 뷰 컨트롤러가 존재하는 동안 메모리에서 해제되지 않아야 하기 때문에 강한 참조를 사용합니다.
2. 약한 참조 Weak Reference
약한 참조는 객체를 참조할 때, 참조횟수를 증가시키지 않습니다.
따라서 객체의 참조횟수가 0이 되면, weak 참조가 객체를 참조하고 있더라도 메모리에서 해제됩니다.
자동해제
객체가 메모리에서 해제되면, weak 참조는 자동으로 nil로 설정됩니다.
그래서 weak 참조변수는 항상 옵셔널 Optional 타입이어야 합니다.
주로 사용하는 경우
<델리게이트 패턴>에서 자주 사용합니다. 보통 델리게이트는 자신을 참조하는 객체보다 오래 살아있지 않도록 설계됩니다.
그렇지 않으면 강한 참조 사이클이 발생하여 메모리 누수가 발생할 수 있습니다.
메모리 누수를 방지하기 위해 순환 참조를 끊어야 할 때 사용합니다. 델리게이트 패턴, 부모-자식 관계에서 부모가 자식을 참조할 때, 자식이 부모를 약한 참조로 참조하는 경우에 주로 사용됩니다.
3. 비소유 참조 Unowned Reference
unowned 참조도 참조횟수를 증가시키지는 않지만, 참조하고 있는 객체가 해제된 후에도 자동으로 nil이 되지 않습니다.
이 참조를 사용하려고 하면 프로그램이 크래시 될 수 있습니다.
따라서, 객체의 생명주기가 명확하게 연결된 상황에서만 사용합니다.
델리게이트 패턴에서 왜 약한 참조를 사용하는지 코드를 통해서 볼까유
// 두번째 뷰 컨트롤러에서 정의된 델리게이트 프로토콜
protocol SecondViewControllerDelegate : AnyObject{
func didSendDataBack(data : String)
}
// 두번째 뷰 컨트롤러 ( 데이터를 보낼 쪽 ) ( 반대로 보낸다 )
class SecondViewController : UIViewController, SecondViewControllerDelegate {
// Optional
weak var delegate : SecondViewControllerDelegate?
var dataToSendBack : String = "Data from Second View Controller"
@IBAction func sendDataBack( _ sender : UIButton ) {
delegate?.didSendDataBack(data:dataToSendBack)
self.navigationController?.popViewController(animated:true)
}
}
'Ios > UI kit' 카테고리의 다른 글
뷰 컨트롤러 간에 데이터를 전달하는 방법 (0) | 2024.08.19 |
---|