2010-05-03 6 views
3

NSString *과 같은 메서드가 있습니다. 존재하는 경우, 나는 그것을 부르고 싶지 않다면 아무것도하지 말라. 선택기이 실제로 유효하지 않기 때문에NSString이 주어진 경우 Obj-C에 메서드가 있는지 알아 보는 방법

SEL eventSelector = NSSelectorFromString(eventSelectorStr); 
if ([delegate respondsToSelector:eventSelector]) { 
    [delegate performSelector:eventSelector]; 
    [delegate adapterDidFinishAdRequest:self]; 
} 
else { 
    // Does not implement selector 
} 

NSSelectorFromString가 선택기로 문자열을 등록하기 때문에이 코드는 작동하지 않기 때문에 respondsToSelector:eventSelector는 충돌의 원인이됩니다.

+0

"항상"true를 반환하지 않습니다. respondsToSelector : 수신기가 해당 메소드를 구현하는 경우에만 true를 반환합니다. 위의 코드에 아무런 문제가 보이지 않습니다. – progrmr

+0

문제는'NSSelectorFromString'이 무효 인 새로운 선택자를 생성하기 때문에'respondsToSelector' 호출시 충돌이 발생합니다. – Justin

답변

5

왜 작동하지 않는다고합니까? 이것은 선택적 대리자 메서드 호출을 구현하는 가장 일반적인 방법입니다. 그 구조가 작동하지 않는 문제는 한번도 없었습니다.

+0

예를 들어'eventSelectorStr'가''fn1 "'이고 위임자에서'fn1'을 구현하면 모든 것이 잘 동작합니다. 그러나'eventSelectorStr'가''''fn2''이고 구현되지 않았다면 NSSelectorFromString이 메서드로 문자열을 등록하고 호출하려고하기 때문에 코드가 충돌을 일으킬 것입니다. – Justin

+1

NSSelectorFromString은 호출하지 않습니다. 이것은 나에게도 항상 효과가있었습니다. – progrmr

+0

NSSelectorFromString은 NSSelectorFromString을 호출하려고하지 않지만 코드의 다음 줄인'[delegate respondsToSelector : eventSelector]'는 충돌을 일으킬 것입니다. – Justin

0

eventSelector != nil을 사용하기 전에 확인하십시오.

+1

'NSSelectorFromString'이 문자열을 선택자로 등록하고 그 값을 반환하기 때문에'eventSelector'는 결코 nil이 아닙니다. – Justin

+0

eventSelector는 nil 일 수 있습니다. NSSelectorFromString 설명을 읽으십시오. – progrmr

+0

제 경우는 아닙니다. 의견을 읽어주십시오. – Justin

1

혼란을 정리해 보겠습니다.

NSSelectorFromString()은 문자열에서 유효한 선택자를 생성하며 그렇게 할 때 충돌하지 않습니다. respondsToSelector:은 충돌없이 대리인이 해당 메서드를 구현하는지 여부를 유효하게 결정합니다. performSelector :를 호출하면 대리자가 구현하지 않는 선택기로 인해 충돌이 발생할 수 있습니다.

그러나 여기 상황이 아닙니다. 코드가 유효합니다. 이 코드에서 크래시가 발생하면 오류 메시지를 확인하고 대신 adapterDidFinishAdRequest:을 찾습니다.

0

이 점을 이해하는 데 다소 시간이 걸렸습니다. 주요 통찰력은 선택기 참조가 기본적으로 Dressed-up C 문자열 인 이며 은 특정 클래스 또는 개체에 '속하지'않습니다. NSSelectorFromString() 문서에서 selector가 'registered'라고 말하면 Objective-C 런타임에서 selector로 사용하기 위해 Dressed-up C 문자열이 '축복'(내 용어)이라는 것을 의미합니다.

반환 값

aSelectorName에 의해 명명 된 선택 :

여기에 애플의 문서에서 NSSelectorFromString()의 반환 값에 대한 부분입니다. 이 경우 aSelectorNamenil거나 는 (이것은 단지 메모리가 부족 있어야) UTF-8로 되돌아 (SEL)0 변환 될 수 없다. 주의 깊게 읽기

은 문자열이 nil 인 경우 (SEL)0이 반환되도록 할 수 상황이라는 것을 보여준다거나 메모리가 부족합니다.

관련 문제