ios - 动态地向应用程序委托(delegate)添加一个方法

标签 ios objective-c

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

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

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

如果我没记错的话,[[UIApplication sharedApplication] delegate] [2] 是我的应用委托(delegate)的实例。

我想将我的实例方法 [1] 从任何其他类动态添加到应用程序委托(delegate) [2]。

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

编辑:

按照@mipadi的建议,我正在尝试调用

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

但我收到以下错误:

  • 消息发送表达式开头缺少“[”
  • 应为 ']'
  • 数组大小为非整数类型“Class”

以及以下警告:

  • 缺少类型说明符,默认为“int”

我真的不确定出了什么问题,而且这个错误对我来说毫无意义。

最佳答案

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

假设您的委托(delegate)类名为 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] code> 返回自身。[MyDelegate class] 确实返回 MyDelegate 的元类,如您所料。)

关于ios - 动态地向应用程序委托(delegate)添加一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36658745/

相关文章:

ios - 具有单击和长按事件的 UIButton swift

ios - 如何在Objective-C中传递2个参数

IOS/objective-C : Get value of property of object in array

ios - 使用 sqlite3_column_text() 获取整数值

ios - 通过 Segue 转发数据(objective-c)

ios - 如何在 UITableView swift 中更改行长度

android - Android和IOS如何连接SQL Server

iphone - 排序NSMutableDictionary的数据

iphone - 从适合一定宽度的字符串中提取字符串

iphone - UITableView 不接受触摸传递