анонимные классы могут быть реализованы с помощью библиотеки.Несколько месяцев назад я работал над вилкой MMMutableMethods
, чтобы улучшить старую реализацию (обсуждение с автором) и добавить собственный механизм без каких-либо манипуляций во время выполнения.
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'
возможно дубликат [? Реализации делегата Anonymous в Objective-C] (http://stackoverflow.com/questions/766475/anonymous-delegate-implementation-in- цель-с) –
@Dave DeLong Уточненный заголовок, чтобы отличать этот вопрос. В этом случае контекст является статическим методом. – hpique
контекст не имеет значения. Вы должны предоставить объект ('id') в качестве делегата, а в другом вопросе вполне понятно, что в Objective-C нет пока еще анонимного класса, поэтому вам придется использовать нормальный объект. –