Objective-C에서 메소드, 선택기 및 메시지의 차이점은 무엇입니까?
답변:
이것은 좋은 질문입니다.
선택기 -선택기는 메소드 의 이름 입니다. 이러한 선택기에 매우 익숙 : 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:
에 인수 obj
및 key
. NSInvocation
나중에 호출 할 수 있도록 메시지를 개체에 캡슐화 할 수 있습니다 . 수신자 에게 메시지가 전송됩니다 . (즉, 메시지를 "수신"하는 객체).
방법 -방법은 선택기와 구현 (및 동반 메타 데이터)의 조합입니다. "구현"은 실제 코드 블록입니다. 함수 포인터 (an IMP
)입니다. 실제 메서드는 Method
구조체 (런타임에서 검색 가능)를 사용하여 내부적으로 검색 할 수 있습니다 .
요청하지 않은 기타 관련 사항 :
메서드 시그니처 -메서드 시그니처는 메서드에 의해 반환되고 수락되는 데이터 유형을 나타냅니다. 런타임시 NSMethodSignature
및 (일부 경우) raw 를 통해 표현할 수 있습니다 char*
.
구현 -메소드의 실제 실행 가능한 코드. 런타임시 유형은이며 IMP
실제로는 함수 포인터입니다. iOS 4.3에는 블록을 IMP
. 이것은 정말 멋지다 .
알아두면 좋은 점 중 하나는 메서드 (선택자) 의 이름 이 메서드 (IMP) 의 구현 과 다르다는 것 입니다. 이것은 당신이 대담하다고 느끼면 서로 바꿀 수 있음을 의미합니다. 수행중인 모든 작업은 해시 테이블의 항목을 편집하는 것이므로 런타임에 메서드를 추가하고 제거 할 수도 있습니다. 키는 선택기이고 값은 IMP
메서드의 것입니다. 이것은 당신이 정말 미친 짓을 할 수있게 해준다. 희미한 마음이 아닙니다. :)
if
문으로 하나의 메소드를 생성하지 않는 이유는 무엇입니까? if
s 없이는 우리의 방법이 그들의 말을하는 더 순수한 방법 이되기 때문이라고 생각합니다 . '상태 처리'와 그 주위를 도는 '동작'이 같은 방법이어서는 안된다는 결론을 내립니다.
메소드는 객체 또는 클래스가 어떤 작업을 수행하도록 요청 될 때 실행되는 구현입니다. 포함하는 클래스의 범위에 있으므로 다른 클래스를 통해 참조 할 때 다릅니다. 선택기는 메서드의 이름을 나타내는 식별자입니다. 특정 클래스 또는 메서드와 관련이 없으며 클래스 또는 인스턴스 메서드인지 여부에 관계없이 모든 클래스의 메서드를 설명하는 데 사용할 수 있습니다.
간단히 말해 선택기는 사전의 키와 같습니다. 누군가가 말하는 방법을 알려줄 수 있지만 사전 자체 (클래스 또는 객체)가있는 경우에만 가능합니다. 방법은 선택기를 키로 사용하여 사전에서 값을 요청할 때 얻는 것입니다.
이 사이트는 문제의 모든 용어에 대한 좋은 개요를 제공합니다 : http://www.otierney.net/objective-c.html
링크를 확인하십시오. 그러나 간략한 요약을 제공하겠습니다.
메서드는 기본적으로 좋아하는 프로그래밍 언어에서 사용하는 함수 메서드와 같습니다.
메시지 (기사에서) "메시지는 다른 객체로 동적으로 전달 될 수 있습니다. Objective-C에서 객체에 대한 메시지를 호출하는 것은 객체가 해당 메시지를 구현한다는 의미가 아니라 어떻게 든 메시지에 응답하는 방법을 알고 있다는 의미입니다. 직접 구현하거나 방법을 아는 객체에 메시지를 전달합니다. "
선택자는 두 가지를 의미 할 수 있습니다. 메서드 이름을 참조하거나 "소스 코드가 컴파일 될 때 이름을 대체하는 고유 식별자를 참조합니다. 컴파일 된 선택기는 SEL 유형입니다." ( 출처 : http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocSelectors.html )