할 수 있는 방법을 동적으로 선택기를 만들에 런타임으로 Objective-C?
-
02-07-2019 - |
문제
내가 알고 있을 만드는 방법 SEL
에서 컴파일을 사용하여 시간 @selector(MyMethodName:)
하지만 내가 무엇을 원하는지 선택기를 만들에서 동적으로는 NSString
.도 가능합니까?
내가 무엇을 할 수 있습니다:
SEL selector = @selector(doWork:);
[myobj respondsToSelector:selector];
내가 무엇을 하고 싶:(의사 코드,이것은 분명히 작동하지 않)
SEL selector = selectorFromString(@"doWork");
[myobj respondsToSelector:selector];
내가 찾고 있었어 애플 API 문서만 발견하지 않았는 방식으로에 의존하지 않은 컴파일시 @selector(myTarget:)
문입니다.
해결책
나 Objective-C 프로그래머,단순히 sympathizer,그러나 어쩌면 NSSelectorFromString 은 당신이 필요합니다.그것은 언급된 명에 런타임 참조 사용할 수 있다는 것을 변환할 문자열을 선택합니다.
다른 팁
에 따라 XCode 문서,당신의 psuedocode 기본적으로 바로 그것을 가져옵니다.
그것은 가장 효율적인 값을 할당하 SEL 변수에서 컴파일한 시간으로@선택()지침.그러나 어떤 경우에,프로그램이 필요할 수 있습을 변환할 문자열하는 선택을 수 있습니다.이 수행할 수 있습 NSSelectorFromString 기능:
setWidthHeight = NSSelectorFromString(aBuffer);
편집:망이야,너무 느려집니다.P
난 것을 말 그것은 조금 더 복잡한 이전보다는 응답자의 답변을 제안할 수 있습...만약 당신이 실제로 정말 원 을 만들이 선택기...다만"전화"하나는 당신은"놓고 주위는"...
당신을 만들어야 함수 포인터이 될 것이라는 의"새로운 방법"..그래서 같은 방법 [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 반품,개체 발신자의 개체수)
class_addMethod(self.class, @selector(theMethod:), (IMP)impFunct, "v@:@");
당신이 볼 수있는 몇 가지 좋은 예의이 종류의 런타임이다., 에서 하나의 제 repos,여기에.
내가 이것을 알고 대답했을 위해 오래 전에,하지만 아직도 나는 글을 공유합니다.를 사용하여 이 작업을 수행할 수 있습 sel_registerName
너무입니다.
예제 코드에서 질문을 다시 쓸 수 있습니다 다음과 같다:
SEL selector = sel_registerName("doWork:");
[myobj respondsToSelector:selector];