할 수 있는 방법을 동적으로 선택기를 만들에 런타임으로 Objective-C?

StackOverflow https://stackoverflow.com/questions/112643

  •  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];
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top