[objective-c] Objective-C를 사용하여 런타임에 선택기를 어떻게 동적으로 만들 수 있습니까?
을 사용하여 SEL
컴파일 타임에 를 만드는 방법을 알고 @selector(MyMethodName:)
있지만 NSString
. 이것이 가능할까요?
내가 할 수있는 것:
SEL selector = @selector(doWork:);
[myobj respondsToSelector:selector];
내가 원하는 것 : (의사 코드, 이것은 분명히 작동하지 않습니다)
SEL selector = selectorFromString(@"doWork");
[myobj respondsToSelector:selector];
Apple API 문서를 검색했지만 컴파일 시간 @selector(myTarget:)
구문 에 의존하지 않는 방법을 찾지 못했습니다 .
답변
저는 Objective-C 프로그래머가 아니라 단순히 동조자이지만 NSSelectorFromString 이 필요할 수도 있습니다. 런타임 참조 에서 문자열을 선택 자로 변환하는 데 사용할 수 있다는 것이 명시 적으로 언급되어 있습니다.
답변
XCode 문서에 따르면 의사 코드가 기본적으로 올바르게 작동합니다.
@selector () 지시문을 사용하여 컴파일 타임에 SEL 변수에 값을 할당하는 것이 가장 효율적입니다. 그러나 어떤 경우에는 프로그램이 런타임에 문자열을 선택기로 변환해야 할 수도 있습니다. 이것은 NSSelectorFromString 함수로 수행 할 수 있습니다.
setWidthHeight = NSSelectorFromString(aBuffer);
편집 : 부머, 너무 느립니다. :피
답변
이전 응답자의 답변이 제안하는 것보다 조금 더 복잡 하다고 말해야합니다. 정말로 선택자를 만들고 싶다면 … “둘러서있는” “전화 하나”가 아니라 .. .
“new”메서드에 의해 호출 될 함수 포인터를 만들어야합니다. .. 같은 메서드의 경우 다음과 같이 [self theMethod:(id)methodArg];
작성합니다.
void (^impBlock)(id,id) = ^(id _self, id methodArg) {
[_self doSomethingWith:methodArg];
};
그런 다음 IMP
블록을 동적으로 생성해야합니다. 이번에는 “self”, the SEL
및 모든 인수를 전달합니다.
void(*impFunct)(id, SEL, id) = (void*) imp_implementationWithBlock(impBlock);
전체 빨판에 대한 정확한 메서드 서명과 함께 클래스에 추가합니다 (이 경우 "v@:@"
, void return, object caller, object argument).
class_addMethod(self.class, @selector(theMethod:), (IMP)impFunct, "v@:@");
여기 내 저장소 중 하나에서 이러한 종류의 런타임 헛소리에 대한 좋은 예를 볼 수 있습니다 .
답변
오래 전에 답변을 받았지만 여전히 공유하고 싶습니다. 이것은 다음을 사용하여 수행 할 수 있습니다.sel_registerName
.
질문의 예제 코드는 다음과 같이 다시 작성할 수 있습니다.
SEL selector = sel_registerName("doWork:");
[myobj respondsToSelector:selector];