È possibile modificare la superclasse di un oggetto in fase di runtime? Se é cosi, come?Modifica dinamica della superclasse di un oggetto
risposta
una breve domanda, una risposta breve: sì, isa swizzling
What Makes Objective C Dynamic?, page 66
Un esempio:
ho una classe che gestisce le connessioni a un REST API, è chiamato APIClient. Nei test voglio connettermi a un server diverso.
Nel target test ho sottoclasse APIClient
#import "ApiClient.h"
@interface TestApiClient : ApiClient
//…
@end
@interface TestApiClient()
@property (nonatomic, strong, readwrite) NSURL *baseURL;
@end
@implementation TestApiClient
- (NSMutableURLRequest *)requestWithMethod:(NSString *)method
path:(NSString *)path
parameters:(NSDictionary *)parameters
{
self.baseURL = [NSURL URLWithString:@"http://localhost:8000/"];
return [super requestWithMethod:method path:path parameters:parameters];
}
@end
nella classe di test Unità faccio la swizzling #import
@implementation APIUnitTests
+(void)load
{
client = [[ApiClient alloc ] init];
object_setClass(client, [TestApiClient class]);
}
//…
@end
Questo CAS è salva, come ho prima creato una sottoclasse di un classe base e quindi sostituito quest'ultimo con la sottoclasse. Poiché la sottoclasse è anche una classe base, questa è un'ereditarietà valida.
Questo sembra estremamente pericoloso. Perché mai vorresti? –
se fatto bene è molto potente, Apple lo usa per KVO: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/Articles/KVOImplementation.html – vikingosegundo
Io personalmente lo uso per ispezionare codice: sottoclassi e sovrascrivo i metodi a cui sono interessato per registrare alcune informazioni e chiamare i metodi originali su super. – vikingosegundo
È sicuramente possibile utilizzare il runtime ObjC, ma sarà un po 'peloso ... Questo è un collegamento ai documenti di Apple: Objective-C Runtime e un esempio del suo utilizzo: Objective-C Runtime Programming.
- 1. Uso della superclasse per inizializzare un oggetto sottoclasse java
- 2. Modifica dinamica della connessione di un Crystal Report
- 3. Modifica dinamica del DataStore di un ComboBox
- 4. Modifica dinamica colore cella datagridview
- 5. Calling awakeFromNib della superclasse
- 6. C# Modifica della posizione di un oggetto di programmazione
- 7. selezione profonda dinamica di un oggetto JavaScript
- 8. Modifica dinamica della finestra di dialogo dell'interfaccia utente jQuery
- 9. Programmazione dinamica - modifica apportata
- 10. Viene creata un'istanza di superclasse quando istanziamo un oggetto?
- 11. Java: modifica dinamica del livello di registrazione
- 12. Nascondere i metodi della superclasse
- 13. Rails - mancata corrispondenza della superclasse
- 14. Modifica dinamica della larghezza o altezza lineare su Android
- 15. Modifica dinamica dell'altezza della riga in un listview basato sul numero di voci di elenco
- 16. Aggiunta dinamica di proprietà a un oggetto dinamico?
- 17. allocazione dinamica della memoria Java?
- 18. Aggiunta dinamica di membri a un oggetto dinamico
- 19. Modifica di un proprietario della tabella
- 20. subclass.prototype = new superclasse() vs. sottoclasse = new superclasse()
- 21. Caricamento della classe dinamica PHP
- 22. Modifica dinamica delle schede in Ionic 2
- 23. Perché questo generico non riconosce il limite della superclasse (Java)?
- 24. Yii - modifica dinamica delle regole dal controller
- 25. Ottieni il nome della superclasse in ES6
- 26. Swift Deve chiamare un inizializzatore designato della superclasse uiinputviewcontroller
- 27. metodi della superclasse di tornare tipo sottoclasse in rapida
- 28. Modifica dinamica dell'elemento HTML in webView Android
- 29. Modifica dinamica del testo dell'intestazione di colonna in JTable
- 30. Algoritmo modifica monete con programmazione dinamica
Dai un'occhiata a http://stackoverflow.com/questions/11221110/my-isa-swizzling-breaks-kvo per un esempio di isa swizzle. – mttrb
Inoltre, che cosa significa "la superclasse di un oggetto"? Un * oggetto * non ha una superclasse. Un oggetto ha una classe e la sua classe ha una superclasse. Se invece tu modifichi la superclasse della classe dell'oggetto, ** tutti i membri di quella classe saranno interessati, ** non solo quel singolo oggetto. –
perché la superclasse non è una classe corrente? cosa succede alla classe attuale? prima devi pensare attentamente –