[objective-c] Objective-C의 선택자?

첫째, 선택자가 무엇인지 정말 잘 이해하지 못합니다. 내 이해로는 메서드의 이름이며 ‘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’조건을 얻을 수 없습니다.



답변

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

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

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


답변

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

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


답변

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


답변

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

SEL sel = @selector(lowercaseString);


답변

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


답변

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

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

처럼

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

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


답변

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

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