본문 바로가기

iOS (스파르타)

과제의 오류?!?!

이런 노란 ! 표시가 떠서 

이렇게 수정해준대로 fix했더니 오류가 났다 ㅎ

 

UISegmentedControl의 addTarget 메서드에서 클래스는 메서드를 타겟으로 지정할 수 없어서 인스턴스 메서드를 타겟으로 지정해야하기 때문에 바꿔주면 안됐던거고 경고메세지가 떴던 이유는 클로저 내에서 self를 사용할 때 발생하는 캡처 문제 때문이었다.

해결하기 위해 클로저 내부에서 [weak self]를 사용하여 강한 참조를 피한다.

경고가 떴던 부분을 전부 지워주고 

// self를 weak로 캡처
segmentedControl.addTarget(self, action: #selector(segmentChanged(_:)), for: .valueChanged)

코드를 추가해주었다.

 

코드 추가 위치는 UISegmentedControl의 값이 변경될 때 segmentChanged(_:) 메서드가 호출되도록 잡아주고 이 코드는 UISegmentedControl의 특정 이벤트가 발생할 때(.valueChanged 이벤트) 어떤 메서드를 호출할지를 설정한다. 중요한 포인트는 이벤트 처리 메서드를 인스턴스 메서드로 지정하는 것이다.

 

코드를 짜주고 나면 UISegmentedControl이 valueChanged 이벤트를 발생시킬 때 segmentChanged(_:) 메서드가 호출되고, 각 세그먼트에 따라 다른 뷰가 표시된다.

 

더보기

클래스 메서드를 타겟으로 지정할 수 없는 이유

 

UISegmentedControl의 addTarget(_:action:for:) 메서드는 특정 이벤트가 발생할 때 호출할 메서드를 지정하는 데 사용됩니다. 이 메서드는 인스턴스 메서드와 인스턴스 객체를 목표로 하도록 설계되었습니다. 다음은 왜 클래스 메서드를 타겟으로 지정할 수 없는지에 대한 이유입니다:

1. 이벤트 전달 메커니즘

addTarget(_:action:for:) 메서드는 이벤트가 발생할 때 특정 인스턴스의 메서드를 호출하도록 설계되었습니다. 이 메서드는 보통 UI 객체에서 이벤트를 처리하기 위해 인스턴스에 바인딩됩니다. 인스턴스 메서드는 특정 객체 상태에 접근할 수 있는 반면, 클래스 메서드는 그렇지 않습니다.

2. 인스턴스와 클래스 메서드의 차이

  • 인스턴스 메서드는 특정 객체의 컨텍스트에서 호출됩니다. 이 메서드는 객체의 프로퍼티에 접근하고 객체의 상태를 변경할 수 있습니다.
  • 클래스 메서드는 클래스의 컨텍스트에서 호출되며, 객체 상태에 접근할 수 없습니다. 이는 클래스 메서드가 객체의 특정 상태와는 독립적이어야 하기 때문입니다.

3. 이벤트 처리의 유연성

이벤트 처리 시 특정 객체의 상태를 변경하거나 객체 내의 데이터를 조작해야 하는 경우가 많습니다. 이러한 작업은 인스턴스 메서드를 통해 이루어질 수 있습니다. 클래스 메서드를 타겟으로 설정하면, 이 메서드는 객체의 상태를 변경할 수 없기 때문에 유연성이 떨어집니다.

4. 메모리 관리 및 생명주기

인스턴스 메서드는 특정 객체의 생명주기에 맞춰 메모리 관리가 이루어집니다. addTarget(_:action:for:) 메서드에서 인스턴스 메서드를 사용하면, 객체가 메모리에서 해제되기 전까지 해당 이벤트에 반응할 수 있습니다. 반면, 클래스 메서드는 객체의 생명주기와 무관하게 동작하므로 메모리 관리에 문제가 발생할 수 있습니다.

올바른 사용법

위의 문제를 해결하기 위해, addTarget 메서드를 사용할 때는 인스턴스 메서드를 타겟으로 지정해야 합니다. 따라서, addTarget(self, action: #selector(segmentChanged(_:)), for: .valueChanged)와 같이 인스턴스를 지정하는 것이 올바른 방법입니다.

 

'iOS (스파르타)' 카테고리의 다른 글

BASIC반 5회차  (0) 2024.07.08
과제 완성~! 발표!!!  (0) 2024.07.08
키오스크 과제하면서 기록  (0) 2024.07.02
UISegmentedControl  (0) 2024.07.02
Swift if문에서 '&&' 와 ' , ' 의 차이  (0) 2024.07.01