[iOS] Selector 란?

CastleSilver·2023년 4월 13일
0

iOS 공부

목록 보기
7/13
post-thumbnail

Objective-C에서의 Selector

  1. 메서드의 문자열을 참조(동일한 이름을 가진 메서드들은 동일한 셀렉터를 가지게 됨)
  2. 해당 메서드가 존재하는 메모리의 포인터 값을 사용
  3. 런타임 시점에서 호출할 메소드를 결정

따라서 Obj-c에서는 동적으로 메서드를 동작시키려 할 때 Selector를 사용했었습니다.

Swift에서의 Selector

Obj-c에서와는 달리 swift에서는 별도의 객체를 사용하지 않아도 메서드를 동적으로 동작시킬 수 있습니다.
그러나 아직까지도 많은 iOS의 API 문서들이 Obj-c 기반으로 동작하고 있기 때문에 이 문서들에서 Selector 타입을 요구하는 경우 이를 대체할 수 있는 타입을 Selector에서 제공할 수 있어야 합니다.

이런 필요성 때문에 Swift에서 Selector가 등장하게 되었습니다.

let selector = #selector(someFunction)

Swift는 컴파일 시점에서 메서드를 바인딩(함수를 호출할 때 그 함수가 위치한 메모리 주소로 연결해주는 것)하는 것과 달리 Obj-c는 런타임에 메서드를 바인딩합니다. 따라서 @objc를 붙임으로써 Swift에게 Obj-c에 의존적인 메서드를 사용할 때는 해당 메서드가 동적 바인딩과 유사한 방식으로 컴파일 되어야 함을 컴파일러에게 알려주어야 합니다. 이 어노테이션 표시가 있으면 Swift로 작성된 코드라 할 지라도 Obj-c 런타임에서도 사용할 수 있게 됩니다.

예외

그러나 obj-c 시절부터 존재했던 프레임워크에 속하는 함수라면 @objc 가 붙지 않아도 objc와 상호호환 가능합니다. UIKit에 속하는 대부분에 프레임워크들이 이 경우에 해당합니다.

profile
우당탕탕 비전공자 개발자

0개의 댓글