설명
둘은 스토리보드와 연결을 담당
@ 이란
컴파일러에게 어떤 속성을 가지고 있는지 전하는 예약어
- @UIApplicationMain - 어플리케이션의 main 부분이라는 의미
IB는 Interface Builder의 약자
@IBAOutlet, @IBAction은 각각 InterFace Bulieder와 연결된 outlet, action을 의미
Text나 Button 등을 control로 땡겨와서 사용 가능
Text에서 값이나 여러 정보를 설정
@IBOutlet
은 UILabel!
과 같이 강제로 언래핑
이 됨
→ VC가 로드 되면 그 안에 있는 UI들은 런타임에 nil 값을 가지지 않음
@IBOutlet weak var titleLabel: UILabel!
self.titleLabel.text = "Hello World"
self.titleLabel.textColor = .purple
self.titleLabel.shadowColor = .black
self.titleLabel.sizeToFit()
self.titleLabel.center.x = self.view.center.x
모든 ViewController는 자신이 관리하는 view
에 대해 강한 참조를 유지함
ViewController - View는 영혼의 파트너기 때문
View는 자신이 갖는 UI 컴포넌트 객체들을 강하게 참조하고 있음
👉 UI 객체들은 뷰컨트롤러 인스턴스 내부에 저장되는게 아니기 때문에, 뷰컨트롤러는 Outlet 변수로 UI 객체들을 참조하는 것임
그래서 강한 참조와 약한 참조일 때의 Reference Count를 비교하면 아래처럼 될 것이다.
즉, 참조 카운트가 감소하지 않아서 발생하는 메모리 누수를 방지하기 위해서 @IBOutlet
연결 시 weak
참조가 기본적으로 적용되는 것이다.
근데 일반적으로는 강한 참조를 해도 메모리 누수가 발생하지 않을 것이다.
왜냐하면 위 그림의 강한 참조를 기준으로
순서대로 동작하면서 UI 객체의 레퍼런스 카운트는 0이 될 것이다.
하지만 메모리 누수가 발생하는 경우가 있다.
앱 사용 중 메모리가 부족해지면 ViewController는 didReceiveMemoryWarning()
라는 메서드를 호출하게 되는데,
⇒ 이 메서드는 부족한 메모리를 확보하고자 ViewController의 view
를 nil
처리한다.
그렇기 때문에 View는 메모리에서 해제되어도, VC의 UI 객체에 대한 참조는 감소하지 않아서 UI 객체가 메모리에 남아 있게 된다.
참고로 뷰컨트롤러가 갖는
view
는암시적 추출 옵셔널
이기 때문에,
뷰컨트롤러가 UI 객체를@IBOutlet weak
참조하는 경우didReceiveMemoryWarning()
로 뷰가 메모리 해제되고 나서 아울렛 변수로 접근하면 에러가 발생할 수 있다.
이렇게 뷰컨트롤러가 존재하는 한 반드시 UI 객체가 있어야 한다면 강한 참조를 사용할 수 있을 것 같다.
일단 @IBOutletCollection
라는게 있는 줄도 몰랐는데, 참고 포스팅을 통해 알게 되었다.
@IBOutletCollection
은 UI 객체들의 참조를 배열로 저장할 수 있는데, Swift의 배열은 구조체로 정의되어 있기 때문에 참조 카운트를 관리할 필요가 x
iOS) IBOutlet연결 Strong VS Weak
버튼의 동작이나 여러가지 동작이 일어났을때 어떤 행동을 할지 정의를 함수안에 작성
@IBAction func nextButtonTouched(_ sender: Any) {
print("버튼이 작동했습니다.")
}
@IBAction func nextButtonTouchUp(_ sender: Any) {
print("버튼이 떼어졌습니다.")
}
@IBAction func nextButtonTouchDown(_ sender: Any) {
print("버튼이 눌러졌습니다.")
}
아래와 같이 여러개의 버튼에 Action을 추가 가능
1. Touch Down
Touch Down Repeat
3. Touch Drag Inside
4. Touch Drag Outside
5. Touch Drag Enter
6. Touch Drag Exit
7. Touch Up Inside
8. Touch Up Outside
9. Touch Cancel
10. Primary Action Triggered
11. Editing Did Begin
12. Editing Changed
13. Editing Did End
14. Editing Did End On Exit