C'è un modo per ottenere qualcosa come un dizionario di tutte le coppie chiave-valore di una classe?C'è un modo per determinare dinamicamente ivars di una classe in fase di esecuzione in Cocoa/Cocoa Touch?
risposta
Si dovrebbe eseguire il rollover utilizzando lo Objective-C Runtime functions. Ecco un codice di esempio molto semplice. Si noti che ottenere gli ivar di una classe non ottiene gli ivar della sua superclasse. Dovresti farlo in modo esplicito, ma le funzioni sono tutte presenti nel runtime.
#import <objc/objc-runtime.h>
#include <inttypes.h>
#include <Foundation/Foundation.h>
@interface Foo : NSObject
{
int i1;
}
@end
@implementation Foo
@end
@interface Bar : Foo
{
NSString* s1;
}
@end
@implementation Bar
@end
int main(int argc, char** argv)
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
unsigned int count;
Ivar* ivars = class_copyIvarList([Bar class], &count);
for(unsigned int i = 0; i < count; ++i)
{
NSLog(@"%@::%s", [Bar class], ivar_getName(ivars[i]));
}
free(ivars);
[pool release];
}
Non sono sicuro solo per Ivars ma se li hai definiti come proprietà è possibile accedere alle proprietà disponibili su una classe.
Ho utilizzato SQLitePersistentObjects per un paio di progetti e ha un codice utile che ottiene le proprietà definite sulla classe da utilizzare quando si calcola la serializzazione da e verso sqlite.
Utilizza la funzione class_copyPropertyList per ottenere l'elenco di proprietà disponibili su una classe.
In particolare:
+(NSDictionary *)propertiesWithEncodedTypes
{
// DO NOT use a static variable to cache this, it will cause problem with subclasses of classes that are subclasses of SQLitePersistentObject
// Recurse up the classes, but stop at NSObject. Each class only reports its own properties, not those inherited from its superclass
NSMutableDictionary *theProps;
if ([self superclass] != [NSObject class])
theProps = (NSMutableDictionary *)[[self superclass] propertiesWithEncodedTypes];
else
theProps = [NSMutableDictionary dictionary];
unsigned int outCount;
objc_property_t *propList = class_copyPropertyList([self class], &outCount);
int i;
// Loop through properties and add declarations for the create
for (i=0; i < outCount; i++)
{
objc_property_t * oneProp = propList + i;
NSString *propName = [NSString stringWithUTF8String:property_getName(*oneProp)];
NSString *attrs = [NSString stringWithUTF8String: property_getAttributes(*oneProp)];
NSArray *attrParts = [attrs componentsSeparatedByString:@","];
if (attrParts != nil)
{
if ([attrParts count] > 0)
{
NSString *propType = [[attrParts objectAtIndex:0] substringFromIndex:1];
[theProps setObject:propType forKey:propName];
}
}
}
free(propList);
return theProps;
}
Questo restituisce un dizionario di proprietà - è necessario fare qualche indagine dei risultati che si ottengono indietro, ma si dovrebbe essere in grado di ottenere ciò che vi serve se siete usando le proprietà.
Sì, del tutto possibile:
int numIvars = 0;
Ivar * ivars = class_copyIvarList([anInstanceOfAClass class], &numIvars);
NSMutableDictionary * pairs = [NSMutableDictionary dictionary];
for (int i = 0; i < numIvars; ++i) {
Ivar ivar = ivars[i];
NSString * ivarName = [NSString stringWithCString:ivar_getName(ivar) encoding:NSUTF8StringEncoding];
id ivarValue = [anInstanceOfAClass valueForKey:ivarName];
[pairs setObject:ivarValue forKey:ivarName];
}
free(ivars);
NSLog(@"%@", pairs);
- 1. C'è un modo per ottenere il bytecode per una classe in fase di esecuzione?
- 2. dichiarare dinamicamente i fagioli in fase di esecuzione in primavera
- 3. Estendere classe in fase di esecuzione
- 4. Cambio classe CSS di un elemento in fase di esecuzione
- 5. Modifica implementazione/classe in fase di esecuzione
- 6. Come posso creare una proprietà di classe statica PHP in fase di esecuzione (in modo dinamico)?
- 7. getElementById Dove elemento viene creato dinamicamente in fase di esecuzione
- 8. php creare il metodo di classe in fase di esecuzione
- 9. scegliere una monade in fase di esecuzione
- 10. Compilazione classe Groovy in fase di esecuzione in Java
- 11. Creazione di una classe per un'interfaccia in fase di esecuzione, in C#
- 12. Sencha Touch non in fase di inizializzazione
- 13. C'è un modo per aggiornare dinamicamente i contenuti del bundle di asp.net mvc in fase di esecuzione?
- 14. Scegliere dinamicamente una vista in fase di esecuzione con Ember + Handlebars
- 15. Rimozione di una funzione in fase di esecuzione in PHP
- 16. Aggiungi proprietà alla classe POCO in fase di esecuzione
- 17. C# Crea e modifica classe in fase di esecuzione
- 18. Esiste un modo per accedere a una barra multifunzione (XML) in fase di esecuzione?
- 19. Modifica del valore di una macro in fase di esecuzione
- 20. dinamicamente la creazione di una classe proxy
- 21. Nuovo per Android - Disegnare una vista in fase di esecuzione
- 22. Ottenere l'output di un processo in fase di esecuzione
- 23. Sostituisci bean in fase di esecuzione
- 24. esclusione in fase di esecuzione __setattr__
- 25. Castle Windsor Resolve in fase di esecuzione
- 26. Impostazione tipo generico in fase di esecuzione
- 27. Trova le associazioni per una classe ActiveRecord in fase di esecuzione?
- 28. Genera dinamicamente le classi in fase di runtime in php?
- 29. Posso inserire una colonna in listview in fase di esecuzione?
- 30. Utilizzo di una stringa come variabile in fase di esecuzione
Dal '' class_copyIvarList' è copy' nel nome, sei responsabile per ripulire la memoria. Quindi, hai anche bisogno di 'free (ivars); –
totalmente a destra. Grazie. – nall
Stampa solo bar :: s1. Ma dove i1? –