IBOutlet, IBAction

김민석·2024년 9월 13일
0

iOS

목록 보기
12/12
post-thumbnail

설명

둘은 스토리보드와 연결을 담당

@ 이란

컴파일러에게 어떤 속성을 가지고 있는지 전하는 예약어

  • @UIApplicationMain - 어플리케이션의 main 부분이라는 의미

IB는 Interface Builder의 약자

@IBAOutlet, @IBAction은 각각 InterFace Bulieder와 연결된 outlet, action을 의미

Text나 Button 등을 control로 땡겨와서 사용 가능

IBOutlet

Text에서 값이나 여러 정보를 설정

@IBOutletUILabel!과 같이 강제로 언래핑이 됨

→ 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




@IBOutlet 연결 시 기본 설정이 weak인 이유(김영빈님 정리)

모든 ViewController는 자신이 관리하는 view에 대해 강한 참조를 유지함
ViewController - View는 영혼의 파트너기 때문

View는 자신이 갖는 UI 컴포넌트 객체들을 강하게 참조하고 있음

👉 UI 객체들은 뷰컨트롤러 인스턴스 내부에 저장되는게 아니기 때문에, 뷰컨트롤러는 Outlet 변수로 UI 객체들을 참조하는 것임

그래서 강한 참조와 약한 참조일 때의 Reference Count를 비교하면 아래처럼 될 것이다.

즉, 참조 카운트가 감소하지 않아서 발생하는 메모리 누수를 방지하기 위해서 @IBOutlet 연결 시 weak 참조가 기본적으로 적용되는 것이다.

근데 일반적으로는 강한 참조를 해도 메모리 누수가 발생하지 않을 것이다.

왜냐하면 위 그림의 강한 참조를 기준으로

  1. VC가 메모리에서 해제
    • View의 RC = 0
    • UI 객체의 RC = 1
  2. View도 메모리에서 해제
    • UI 객체의 RC = 0

순서대로 동작하면서 UI 객체의 레퍼런스 카운트는 0이 될 것이다.



강한 참조로 메모리 누수가 발생하는 경우

하지만 메모리 누수가 발생하는 경우가 있다.

앱 사용 중 메모리가 부족해지면 ViewController는 didReceiveMemoryWarning()라는 메서드를 호출하게 되는데,

⇒ 이 메서드는 부족한 메모리를 확보하고자 ViewController의 viewnil 처리한다.

그렇기 때문에 View는 메모리에서 해제되어도, VC의 UI 객체에 대한 참조는 감소하지 않아서 UI 객체가 메모리에 남아 있게 된다.

참고로 뷰컨트롤러가 갖는 view암시적 추출 옵셔널이기 때문에,


뷰컨트롤러가 UI 객체를 @IBOutlet weak 참조하는 경우 didReceiveMemoryWarning()로 뷰가 메모리 해제되고 나서 아울렛 변수로 접근하면 에러가 발생할 수 있다.

이렇게 뷰컨트롤러가 존재하는 한 반드시 UI 객체가 있어야 한다면 강한 참조를 사용할 수 있을 것 같다.



@IBOutletCollection은 weak이 아닌 이유

일단 @IBOutletCollection라는게 있는 줄도 몰랐는데, 참고 포스팅을 통해 알게 되었다.

@IBOutletCollectionUI 객체들의 참조를 배열로 저장할 수 있는데, Swift의 배열은 구조체로 정의되어 있기 때문에 참조 카운트를 관리할 필요가 x

iOS) IBOutlet연결 Strong VS Weak





IBAction

버튼의 동작이나 여러가지 동작이 일어났을때 어떤 행동을 할지 정의를 함수안에 작성

@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

  • 설명: 버튼의 기본 동작이 트리거될 때 발생하는 이벤트입니다. 이 이벤트는 주로 UIControl.Event.primaryActionTriggered와 관련이 있으며, 다양한 컨트롤러와의 호환성을 위해 존재합니다. 일반적인 버튼에서는 Touch Up Inside와 유사하게 동작합니다.
  • 사용 사례: 다양한 컨트롤러에서 통합된 방식으로 주요 액션을 처리하고자 할 때 사용됩니다.

11. Editing Did Begin

  • 설명: 버튼과 직접적인 관련은 없지만, 일반적으로 UITextField와 같은 입력 컨트롤에서 사용됩니다. 입력이 시작될 때 발생하는 이벤트입니다.
  • 사용 사례: 텍스트 입력이 시작될 때의 동작을 처리하고자 할 때 사용됩니다.

12. Editing Changed

  • 설명: 버튼과는 무관하며, 텍스트 필드의 내용이 변경될 때 발생합니다.
  • 사용 사례: 사용자가 텍스트 필드에 입력할 때 실시간으로 변화를 추적하고 싶을 때 사용됩니다.

13. Editing Did End

  • 설명: 텍스트 필드의 편집이 종료되었을 때 발생합니다.
  • 사용 사례: 텍스트 필드의 입력이 끝난 후 동작을 수행하고자 할 때 사용됩니다.

14. Editing Did End On Exit

  • 설명: 사용자가 텍스트 필드에서 Return 키를 눌러 편집을 종료할 때 발생합니다.
  • 사용 사례: 사용자가 입력을 마치고 Return 키를 눌렀을 때 동작을 트리거하고자 할 때 사용됩니다.
profile
개발을 배우는 대학생입니다!

0개의 댓글

관련 채용 정보