我想在Objective-C中的类方法中设置一个对象的委托。伪代码:
+ (ClassWithDelegate*) myStaticMethod {
if (myObject == nil) {
myObject = [[ClassWithDelegate alloc] init];
// myObject.delegate = ?
}
return myObject;
}
在Java中,我只需创建一个实现委托协议的匿名类。我如何在Objective-C中做类似的事情?
基本上,我希望避免创建单独的类(和文件)来实现简单的委托协议。
发布于 2010-09-22 23:31:25
Objective-C中当前没有匿名类。
通常,您可以使用已经存在的对象。例如,对于NSTableViewDataSource,您可以在文档或视图控制器中实现方法,并将其作为委托传递。
或者,您可以让对象本身实现协议,并在默认情况下使其成为自己的委托。
或者,发送委托消息的方法可以检查nil委托,并在这种情况下执行一些合理的操作。
或者,您可以在创建需要委托的对象的实现文件中声明和定义一个类。
发布于 2015-10-13 15:40:39
匿名类可以通过库来实现。几个月前,我在obj-c分支上工作,以改进旧的实现(与作者讨论),并添加我自己的机制,而不需要任何MMMutableMethods
-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(MM_REUSE, *)
创建类MM_CREATE_CLASS(MM_REUSE, *)
和直接实例。默认情况下,类只在第一次执行时创建并重用,但您可以通过调用MM_CREATE_CLASS_ALWAYS(*)
和MM_CREATE_ALWAYS(*)
来避免重用。
第二种机制不会创建任何运行时实例,只需记住选择器的块并将方法调用转发给它们。
我更喜欢第二种方式,不要在运行时创建太多的类。我觉得它更安全,功能也足够强大。
要使用这个库,只需:
pod 'MMMutableMethods', :git => 'https://github.com/k06a/MMMutableMethods'
https://stackoverflow.com/questions/3770359
复制相似问题