2016-12-16 8 views
0

조정할 수있는 앱을 개발 중이며 헤더를 가져올 수없는 클래스를 하나 만들고 싶습니다. 클래스 이름, 클래스 메서드 및 인스턴스 메서드를 알고 있습니다. 어떻게 만들 수 있습니까? 매개 변수가있는 클래스 메서드에 있습니까?iOS에서 IMP를 사용하여 클래스 메서드 호출

Class class = objc_getClass("MMClass"); 
Method initMethod = class_getClassMethod(class, 
              @selector(do:for:)); 
IMP imp = method_getImplementation(initMethod); 
id instance = imp(class,@selector(do:for:),@"do",@"ye"); 

이 권리인가 : 는

+(instancetype)do:(NSString*)string for:(NSString *)antherString; 

내가 뭐하는 거지 것은 다음과 같습니다 클래스 메소드와 MMClass이라는 클래스를 말해?

답변

0

첫 번째로 확실한 이유는 확실하지 않지만 사용하려는 선언이 포함 된 고유 헤더를 만든 다음 가져 오지 않는 것이 좋습니다 (또는 파일 상단의 선언을 인라인 경우 if 당신은 하나의 파일에서만 그것을 사용할 것입니다)? 메소드를 정상적으로 호출 할까? 이 모든 엉망진창을 통과하는 대신에? 컴파일러가 관심을 갖는 것은 호출 할 메소드에 대한 선언을 보는 것입니다. 당신이 함수 포인터를 사용하여 실제 메소드 구현을 호출 할 때

, 당신은 방법의 서명에 해당하는 함수 포인터의 오른쪽 유형으로 캐스팅해야합니다

Class class = objc_getClass("MMClass"); 
Method initMethod = class_getClassMethod(class, @selector(do:for:)); 
IMP imp = method_getImplementation(initMethod); 
id (*foo)(Class, SEL, NSString *, NSString *) = 
    (id (*)(Class, SEL, NSString *, NSString *))imp; 
id instance = foo(class, @selector(do:for:), @"do", @"ye"); 

그러나 그것은 IMP를 얻을 바보 한 번만 사용하게 될 것입니다. 대신, objc_msgSend을 원하는 함수 포인터 유형으로 변환하고 직접 호출해야합니다.

Class class = objc_getClass("MMClass"); 
id (*foo)(Class, SEL, NSString *, NSString *) = 
    (id (*)(Class, SEL, NSString *, NSString *))objc_msgSend; 
id instance = foo(class, @selector(do:for:), @"do", @"ye");