匿名类可以与库来实现。几个月前,我一直在研究MMMutableMethods
fork以改进旧的实现(与作者讨论)并添加我自己的机制,而无需任何obj-c运行时操作。
https://github.com/k06a/MMMutableMethods
A.第一种机制适用于OBJ-C运行时创建类:
MM_CREATE(MM_REUSE,^(Class class){
[class addMethod:@selector(onResultWithId:)
fromProtocol:@protocol(AMCommandCallback)
blockImp:^(id this,id res){
NSLog(@"onResultWithId: %@",res);
}];
[class addMethod:@selector(onErrorWithJavaLangException:)
fromProtocol:@protocol(AMCommandCallback)
blockImp:^(id this,JavaLangException *e){
NSLog(@"onErrorWithJavaLangException: %@",e);
}];
})
B.第二个机制适用于简单的信息提出具体的实施:
MM_ANON(^(MMAnonymousClass *anon){
[anon addMethod:@selector(onResultWithId:)
fromProtocol:@protocol(AMCommandCallback)
blockImp:^(id this,id res){
NSLog(@"onResultWithId: %@",res);
}];
[anon addMethod:@selector(onErrorWithJavaLangException:)
fromProtocol:@protocol(AMCommandCallback)
blockImp:^(id this,JavaLangException *e){
NSLog(@"onErrorWithJavaLangException: %@",e);
}];
})
第一个创建新的obc-j类在运行时,它允许您创建类MM_CREATE_CLASS(MM_REUSE, *)
和直接与MM_CREATE(MM_REUSE, *)
实例。类将仅在首次执行时创建,并在默认情况下重用,但您可以通过调用MM_CREATE_CLASS_ALWAYS(*)
和MM_CREATE_ALWAYS(*)
来避免重复使用。
第二种机制不会创建任何运行时实例,只记住选择器的块并向它们转发方法调用。
我喜欢第二种方式,不要在运行时创建很多类。恕我直言,它更安全,足够强大。
要使用该库只是:
pod 'MMMutableMethods', :git => 'https://github.com/k06a/MMMutableMethods'
([?在Objective-C匿名委托执行]的
可能重复http://stackoverflow.com/questions/766475/anonymous-delegate-implementation-in- objective-c) – 2010-09-22 15:11:38
@Dave DeLong澄清标题以区别于该问题。在这种情况下,上下文是一种静态方法。 – hpique 2010-09-22 15:27:03
上下文无关紧要。你必须提供一个对象('id')作为委托,另一个问题很明显地回答说Objective-C(尚未)中没有匿名类,所以你将不得不使用正常的对象。 – 2010-09-22 15:31:53