classi anonimi possono essere attuate con biblioteca.Diversi mesi fa ho lavorato sulla forcella MMMutableMethods
per migliorare la vecchia implementazione (discutendo con l'autore) e aggiungere il mio meccanismo senza alcuna manipolazione del runtime obj-c.
https://github.com/k06a/MMMutableMethods
A. primo meccanismo funziona su obj-c runtime creazione classe:
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. Secondo meccanismo funziona sul semplice messaggio implementazione in avanti:
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);
}];
})
Prima si crea nuove classi obc-j in runtime, consente di creare classi MM_CREATE_CLASS(MM_REUSE, *)
e istanze direttamente con MM_CREATE(MM_REUSE, *)
. Le classi verranno create solo alla prima esecuzione e riutilizzate per impostazione predefinita, ma è possibile evitare il riutilizzo chiamando MM_CREATE_CLASS_ALWAYS(*)
e MM_CREATE_ALWAYS(*)
.
Il secondo meccanismo non crea alcuna istanza di runtime, basta ricordare i blocchi per i selettori e le chiamate al metodo di inoltro.
Preferisco il secondo modo di non creare molte classi in runtime. IMHO è molto più sicuro e abbastanza potente.
Per utilizzare questa libreria solo:
pod 'MMMutableMethods', :git => 'https://github.com/k06a/MMMutableMethods'
possibile duplicato di [? Implementazione delegato anonimo in Objective-C] (http://stackoverflow.com/questions/766475/anonymous-delegate-implementation-in- obiettivo-c) –
@Dave DeLong Chiarito titolo per differenziare da quella domanda. In questo caso il contesto è un metodo statico. – hpique
il contesto non ha importanza. Devi fornire un oggetto ('id') come delegato, e l'altra domanda risponde chiaramente che non esiste una classe anonima in Objective-C (ancora), quindi dovrai usare un oggetto normale. –