说我有这个实例方法[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'
我真的不确定出了什么问题,这些错误对我来说没什么意义。
答案 0 :(得分:1)
class_addMethod
始终向类中添加实例方法。要添加类方法,您可以将该方法添加到您的类元类。
我们假设您的委托类名为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]
会返回自身。[MyDelegate class]
会不如您所料,返回MyDelegate
的元类。)