动态地向应用委托添加方法

时间:2016-04-16 00:17:05

标签: ios objective-c

说我有这个实例方法[1]:

    -(BOOL)application:(UIApplication *)application
               openURL:(NSURL *)url {

      NSLog(@"url --> %@", url); 
      //Do something...
      return YES;
    }

如果我没弄错的话,[[UIApplication sharedApplication] delegate] [2] 是我的app delegate的实例。

我想动态地将我的实例方法[1]添加到来自任何其他类的app delegate [2]。

我发现class_addMethod *info可能对我有帮助,但它没有提到如何指定它是实例方法还是类方法。

修改

按照@mipadi的建议,我试着打电话

class_addMethod([AppDelegate class], @selector(newMethod), (IMP)myMethodIMP, "v@:");

但我收到以下错误:

  • Missing '[' at start of message send expression
  • Expected ']'
  • Size of array has non-integer type 'Class'

以下警告:

  • Type specifier missing, defaults to 'int'

我真的不确定出了什么问题,这些错误对我来说没什么意义。

1 个答案:

答案 0 :(得分:1)

class_addMethod始终向类中添加实例方法。要添加类方法,您可以将该方法添加到您的类元类

我们假设您的委托类名为MyDelegate。显然,您可以创建MyDelegate的实例。例如,在id obj = [[MyDelegate alloc] init]中,objMyDelegate的实例。但是,MyDelegate类本身是其元类的一个实例。正是这个元类添加了MyDelegate的类方法,因为MyDelegate的类方法实际上是在其元类上定义的实例方法。

因此,要添加实例方法,您可以执行以下操作:

class_addMethod([MyDelegate class], @selector(newMethod), (IMP) newMethodImpl, newMethodTypeSig);

要添加一个类方法,您可以使用MyDelegate的元类作为第一个参数执行相同的操作,您可以使用object_getClass获取:

class_addMethod(object_getClass([MyDelegate class]), @selector(newClassMethod), (IMP) newClassMethodImpl, newClassMethodTypeSig);

(请注意,有点令人困惑的是,[myDelegateInstance class][MyDelegate class]实际上会返回相同的对象;也就是说,+[MyDelegate class]会返回自身。[MyDelegate class]如您所料,返回MyDelegate的元类。)