假设我有这个实例方法[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]
中,obj
是 MyDelegate
的实例。但是,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/