2016-12-16 97 views
0

说我正在开发一个调整应用程序,我想创建一个其头不能导入的类的实例,但我知道类名称,类方法和实例方法我怎样才能创建它在带参数的类方法? 说这个类叫做MMClass与类方法iOS调用类方法与IMP

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

我在做什么是如下:

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"); 

这是正确的?

回答

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");