본문 바로가기

code snippet

[iOS] 뷰의 아웃렛 작성시 weak? strong?

스토리보드를 이용해서 뷰의 아웃렛을 작성할 때 다음 그림처럼 Storage 속성에서 Strong과 Weak 중 하나를 선택해야 한다.




Strong은 객체를 소유해서 레퍼런스 카운트가 증가하는 프로퍼티고 Weak은 객체를 소유하지 않는 포인터다.


Swift 에서는 다음과 같이 생성된다.


@IBOutlet var strongView: MyView!

@IBOutlet weak var weakView: MyView!


오브젝티브 씨에서는 다음과 같이 생성된다.


@property (strong, nonatomic) IBOutlet MyView *strongView;

@property (weak, nonatomic) IBOutlet  MyView *weakView;


Strong으로 선택하면, 뷰 컨트롤러에 작성한 프로퍼티가 뷰를 소유하고 있으므로, 뷰를 removeFromSuperview 메소드로 씬에서 삭제해도 메모리에서 해제되지 않는다. 이에 비해서 Weak로 생성한 아웃렛 프로퍼티는 뷰를 소유하지 않으므로, 뷰를 삭제하면 메모리에서 해제된다.


strongView.removeFromSuperview()      // 메모리에서 해제 안됨

weakView.removeFromSuperview()        // 메모리에서 해제



== 샘플 코드


간단하게 Strong과 Weak 로 아웃렛을 연결하고, 클래스의 deinit 메소드를 이용해서 메모리에서 해제될 때 콘솔에 출력하도록 작성했다.


ViewWithStrongAndWeak.zip





== Tip


뷰를 씬에 삭제했다가 다시 추가해야 하는 상황이라면 Strong 으로 작성하고, 그 외에는 Weak로 작성한다.









반응형