Objective-C의 선택자?


122

첫째, 선택자가 무엇인지 정말 잘 이해하지 못합니다. 내 이해로는 메서드의 이름이며 'SEL'유형의 클래스에 할당 한 다음 respondToSelector와 같은 메서드를 실행하여 수신자가 해당 메서드를 구현하는지 확인할 수 있습니다. 누군가가 더 나은 설명을 제공 할 수 있습니까?

둘째, 지금까지 다음 코드가 있습니다.

NSString *thing = @"Hello, this is Craig";

SEL sel = @selector(lowercaseString:);
NSString *lower = (([thing respondsToSelector:sel]) ? @"YES" : @"NO");
NSLog (@"Responds to lowercaseString: %@", lower);
if ([thing respondsToSelector:sel]) //(lower == @"YES")
    NSLog(@"lowercaseString is: %@", [thing lowercaseString]);

그러나 thing분명히 NSString의 일종이고 lowercaseString에 응답해야 하지만 "YES"를 반환하는 'respondsToSelector'조건을 얻을 수 없습니다.


Apple 개발자 사이트에서 선택기 설명을 읽고 싶습니다. 선택기 .
lothar

14
스탠포드 코스 CS193P 과제 1B? 여기에 똑같은 질문이 있습니다! :)
Corstian Boerman 2013

답변:


181

메소드 이름에 대해 매우주의해야합니다. 이 경우 메서드 이름은 " lowercaseString" 가 아니라 " " 뿐입니다 lowercaseString:(콜론이 없음). 개체가 메시지에는 응답 하지만 메시지에는 응답 하지 NO않기 때문에 반환되는 이유 입니다.NSStringlowercaseStringlowercaseString:

콜론을 언제 추가해야하는지 어떻게 알 수 있습니까? 호출 할 때 콜론을 추가하려는 경우 메시지 이름에 콜론을 추가합니다. 이는 하나의 인수를 사용하는 경우 발생합니다. 인수가 0 인 경우 (에서와 같이 lowercaseString) 콜론이 없습니다. 둘 이상의 인수가 필요한 경우에서와 같이 콜론과 함께 추가 인수 이름을 추가해야합니다 compare:options:range:locale:.

문서를 보고 후행 콜론의 유무를 확인할 수도 있습니다 .


12

선택기 는 컴파일 된 코드에서 직접 메서드를 참조하는 효율적인 방법입니다. 컴파일러는 실제로 값을 SEL에 할당합니다.

다른 사람들은 이미 q의 두 번째 부분을 다루었습니다. 끝에있는 ':'는 찾고있는 것과 다른 서명과 일치합니다 (이 경우 서명이 존재하지 않음).


10

그것은 당신이 원하는 @selector(lowercaseString)것이 아니라 @selector(lowercaseString:). 미묘한 차이가 있습니다. 두 번째는 매개 변수를 의미하지만 (끝에 콜론이 있음) - [NSString lowercaseString]매개 변수를 사용하지 않습니다.


5

이 경우 선택기의 이름이 잘못되었습니다. 여기서 콜론은 메소드 서명의 일부입니다. 이는 메소드가 하나의 인수를 취함을 의미합니다. 나는 당신이 원한다고 믿습니다

SEL sel = @selector(lowercaseString);

3

NSString의 메서드는 lowercaseString(1 개의 인수)가 아니라 lowercaseString:( 0 개의 인수)입니다.


1

콜론을 함수 이름의 일부로 생각하지 말고 구분 기호로 생각하십시오. 분리 할 것이 없으면 (함수와 함께 사용할 값이 없음) 콜론이 필요하지 않습니다.

이유는 모르겠지만이 모든 OO 항목은 Apple 개발자에게 이질적인 것 같습니다. 나는 Visual Studio Express를 잡아서 그것을 가지고 놀 것을 강력히 제안합니다. 하나가 다른 것보다 낫기 때문이 아니라 디자인 문제와 사고 방식을 보는 좋은 방법입니다.

처럼

introspection = reflection
+ before functions/properties = static
- = instance level

문제를 다른 방식으로 보는 것은 항상 좋고 프로그래밍은 궁극적 인 퍼즐입니다.


0

Apple 문서에 대한 이해를 바탕으로 선택기는 호출하려는 메서드의 이름을 나타냅니다. 선택 자의 좋은 점은 호출 할 정확한 메서드가 다른 경우에 사용할 수 있다는 것입니다. 간단한 예로서 다음과 같이 할 수 있습니다.

SEL selec;
if (a == b) {
selec = @selector(method1)
}
else
{
selec = @selector(method2)
};
[self performSelector:selec];

0

Apple 문서에 따라 : https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Selector.html

선택기는 개체에 대해 실행할 메서드를 선택하는 데 사용되는 이름이거나 소스 코드가 컴파일 될 때 이름을 대체하는 고유 식별자입니다. 선택기는 그 자체로 아무것도하지 않습니다. 단순히 방법을 식별합니다. 선택기 메서드 이름을 일반 문자열과 다르게 만드는 유일한 것은 컴파일러가 선택기가 고유한지 확인한다는 것입니다. 선택기를 유용하게 만드는 것은 (런타임과 함께) 주어진 이름에 대해 사용되는 클래스에 적합한 메서드의 구현을 자동으로 가리키는 동적 함수 포인터처럼 작동한다는 것입니다. 메소드 실행에 대한 선택기와 Dog, Athlete 및 ComputerSimulation 클래스 (각각 메소드 실행을 구현 함)가 있다고 가정하십시오.

예 : (lldb) 중단 점 --set selector viewDidLoad

이렇게하면 앱의 모든 viewDidLoad 구현에 중단 점이 설정됩니다. 따라서 선택자는 메서드에 대한 일종의 전역 식별자입니다.

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