iOS使用IMP调用类方法

时间:2016-12-16 07:35:05

标签: ios class methods tweak

假设我正在开发一个调整应用程序,我想创建一个类的实例,其标题无法导入,但我知道类名,类方法和实例方法如何在类方法中使用参数创建它? 用类方法

说这个名为MMClass的类
Array
(
    [0] => Array
        (
            [0] => stdClass Object
                (
                    [class] => button-input btn btn-warning
                    [name] => gorilla-preview
                    [value] => Goat
                    [id] => gorilla-preview
                )

        )

)

我正在做的事情如下:

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

这是对的吗?

1 个答案:

答案 0 :(得分:0)

首先,我不确定我是否说明了这一点,但为什么不用你想要使用的声明创建自己的标题并导入它(或者只是在内部声明内联声明)如果你只想在一个文件中使用它,你的文件)?并正常调用方法?而不是经历所有这些混乱?所有编译器都关心的是它会看到你想要调用的方法的声明。

使用函数指针调用实际方法实现时,需要将其强制转换为与方法签名对应的正确类型的函数指针:

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