objc中方法的反射
在objc中我们可以简单的通过反射(reflection)实现字符串到方法的映射,从而可以动态地实现方法的调用。
对于实例方法 (instance method),我们有很多种方法可以方便地实现这样的效果,比如:
SEL sel = NSSelectorFromString(@"method"); [self performSelector:sel];
或者是:
SEL sel = NSSelectorFromString(@"method"); objc_msgSend(self, sel);
但是对于类方法(class method)的反射,objc没有直接提供类似于performSelector这样的方法来直接操作类,
起初我绕了一些弯子,试图通过获取Method和IMP这一途径来执行类方法
SEL sel = NSSelectorFromString(@"method"); Method m = class_getClassMethod(self.class, sel); IMP imp = method_getImplementation(m); imp(self,sel);
这段代码在ios6.0以下的版本中能够正确的执行,但是在ios6.0以上的版本中执行后就会奇妙crash,我只能不负责任的推测是ios SDK的问题。
这时候我又回过头研究objc_msgSend()这一方法,我们知道它的参数包括,id 类型的receiver,SEL 类型的方法名 已经需要的参数
在经过尝试后发现可以将object的class作为receiver传递给这个方法,结果就是类方法(class method)会和实例方法(instance method)一样被调用
SEL sel = NSSelectorFromString(@"method"); objc_msgSend(self.class, sel);
研究后发现objc中的Class有很大的迷惑性,它本身就是objc_class类型的一个对象,用来描述对象的类信息,而不仅仅是对实例描述的关键字,属于id所描述的范畴之内,所以通过objc_msgSend可以成功将反射后的方法传递给类对象本身。

浙公网安备 33010602011771号