방법과 선택기의 차이점은 무엇입니까?


답변:


142

이것은 좋은 질문입니다.

  • 선택기 -선택기는 메소드 의 이름 입니다. 이러한 선택기에 매우 익숙 : alloc, init, release, dictionaryWithObjectsAndKeys:, setObject:forKey:, 등 콜론은 선택의 일부임을 참고; 이 방법에 매개 변수가 필요함을 식별하는 방법입니다. 또한 (극히 드물지만) 다음과 같은 선택기를 사용할 수 있습니다 doFoo:::.. 이것은 세 개의 매개 변수를 취하는 메소드이며 [someObject doFoo:arg1 :arg2 :arg3]. 선택기 구성 요소의 각 부분 앞에 문자가 있어야 할 필요는 없습니다. 내가 말했듯이 이것은 극히 드물고 Cocoa 프레임 워크에서 사용되지 않을 것입니다. Cocoa에서 직접 선택기로 작업 할 수 있습니다. 유형 SEL: SEL aSelector = @selector(doSomething:)또는SEL aSelector = NSSelectorFromString(@"doSomething:");

  • 메시지 -메시지는 선택자이며 함께 보내는 인수입니다. 내가 말하면 [dictionary setObject:obj forKey:key]"메시지"는 선택자 setObject:forKey:에 인수 objkey. NSInvocation나중에 호출 할 수 있도록 메시지를 개체에 캡슐화 할 수 있습니다 . 수신자 에게 메시지가 전송됩니다 . (즉, 메시지를 "수신"하는 객체).

  • 방법 -방법은 선택기와 구현 (및 동반 메타 데이터)의 조합입니다. "구현"은 실제 코드 블록입니다. 함수 포인터 (an IMP)입니다. 실제 메서드는 Method구조체 (런타임에서 검색 가능)를 사용하여 내부적으로 검색 할 수 있습니다 .


요청하지 않은 기타 관련 사항 :

  • 메서드 시그니처 -메서드 시그니처는 메서드에 의해 반환되고 수락되는 데이터 유형을 나타냅니다. 런타임시 NSMethodSignature및 (일부 경우) raw 를 통해 표현할 수 있습니다 char*.

  • 구현 -메소드의 실제 실행 가능한 코드. 런타임시 유형은이며 IMP실제로는 함수 포인터입니다. iOS 4.3에는 블록을 IMP. 이것은 정말 멋지다 .

알아두면 좋은 점 중 하나는 메서드 (선택자) 의 이름 이 메서드 (IMP) 의 구현 과 다르다는 것 입니다. 이것은 당신이 대담하다고 느끼면 서로 바꿀 수 있음을 의미합니다. 수행중인 모든 작업은 해시 테이블의 항목을 편집하는 것이므로 런타임에 메서드를 추가하고 제거 할 수도 있습니다. 키는 선택기이고 값은 IMP메서드의 것입니다. 이것은 당신이 정말 미친 짓을 할 수있게 해준다. 희미한 마음이 아닙니다. :)


선택이 더 서명 / 경로처럼, 그래서 D 1 : 이것은 훌륭한 대답 하는 방법 자체? 컴파일러에게 알려 주면 이것이 어떻게 찾습니까? 2. 나는 이것이 메소드 자체를 전달하는 것보다 더 효율적이라고 생각합니다. 권리? 3. 모든 선택자와 방법은 1 : 1 관계를 가지기 때문에 이러한 효율성 때문에 방법을 통과하지 못하는 것입니다. 4. 또한 멍청한 예를들 수 있습니다. 런타임에 메서드를 추가하고 제거 할 수도 있습니다. 저는 항상 들어 본 적이 있지만 그렇게 할 필요가 없었고적이 없다고 생각 합니다.
Honey

5a. 선택자 사이를 전환하는 조건부 매개 변수를 전달할 수 있습니까? 5b. 조건부 매개 변수를 선택자에 전달하는 대신 if문으로 하나의 메소드를 생성하지 않는 이유는 무엇입니까? ifs 없이는 우리의 방법이 그들의 말을하는 더 순수한 방법 이되기 때문이라고 생각합니다 . '상태 처리'와 그 주위를 도는 '동작'이 같은 방법이어서는 안된다는 결론을 내립니다.
Honey

9

메소드는 객체 또는 클래스가 어떤 작업을 수행하도록 요청 될 때 실행되는 구현입니다. 포함하는 클래스의 범위에 있으므로 다른 클래스를 통해 참조 할 때 다릅니다. 선택기는 메서드의 이름을 나타내는 식별자입니다. 특정 클래스 또는 메서드와 관련이 없으며 클래스 또는 인스턴스 메서드인지 여부에 관계없이 모든 클래스의 메서드를 설명하는 데 사용할 수 있습니다.

간단히 말해 선택기는 사전의 키와 같습니다. 누군가가 말하는 방법을 알려줄 수 있지만 사전 자체 (클래스 또는 객체)가있는 경우에만 가능합니다. 방법은 선택기를 키로 사용하여 사전에서 값을 요청할 때 얻는 것입니다.


1

이 사이트는 문제의 모든 용어에 대한 좋은 개요를 제공합니다 : http://www.otierney.net/objective-c.html

링크를 확인하십시오. 그러나 간략한 요약을 제공하겠습니다.

메서드는 기본적으로 좋아하는 프로그래밍 언어에서 사용하는 함수 메서드와 같습니다.

메시지 (기사에서) "메시지는 다른 객체로 동적으로 전달 될 수 있습니다. Objective-C에서 객체에 대한 메시지를 호출하는 것은 객체가 해당 메시지를 구현한다는 의미가 아니라 어떻게 든 메시지에 응답하는 방법을 알고 있다는 의미입니다. 직접 구현하거나 방법을 아는 객체에 메시지를 전달합니다. "

선택자는 두 가지를 의미 할 수 있습니다. 메서드 이름을 참조하거나 "소스 코드가 컴파일 될 때 이름을 대체하는 고유 식별자를 참조합니다. 컴파일 된 선택기는 SEL 유형입니다." ( 출처 : http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocSelectors.html )

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.