2010-02-25 16 views
121

Sto cercando di ottenere un nome stringa di una classe dall'oggetto classe stesso.Classe Objective-C -> stringa come: [NSArray className] -> @ "NSArray"

// For instance 
[NSArray className]; // @"NSArray" 

ho trovato object_getClassName(id obj) ma che richiede un'istanza essere passato ad esso, e nel mio caso, che è un lavoro inutile.

Quindi, come posso ottenere una stringa da un oggetto di classe e non un'istanza?

risposta

291
NSString *name = NSStringFromClass ([NSArray class]); 

Si può anche tornare indietro l'altro modo:

Class arrayClass = NSClassFromString (name); 
id anInstance = [[arrayClass alloc] init]; 
+0

Grazie! Come è implementato 'NSStringFromClass'? È più performante memorizzare il nome della classe in una variabile 'static NSString'? – ma11hew28

+13

@MattDiPasquale: tutti i nomi di classe sono memorizzati da qualche parte nel runtime Objective-C (le parti interne del runtime sono per lo più nascoste dall'applicazione ed esposte solo attraverso alcune funzioni API). Ogni oggetto di classe (ad esempio '[NSArray class]') è in realtà una 'struct'. 'Struct' contiene molte informazioni sulla classe, incluso il suo nome, i metodi che implementa, la superclasse, ecc.' NSStringFromClass' tira semplicemente il nome della classe da questo 'struct' e lo converte in un' NSString' . Non memorizzare il nome della classe in un 'NSString statico', non offrirà alcun vantaggio in termini di prestazioni. – dreamlax

+3

@MattDiPasquale: 'NSClassFromString' funziona in modo leggermente diverso. Poiché tutti i nomi delle classi esistono da qualche parte nel runtime Objective-C, 'NSClassFromString' prende la stringa ed esplora l'elenco delle classi mantenute dal runtime alla ricerca della classe che ha il nome specificato. Se lo trova, lo restituisce, altrimenti restituisce 'Nil'. – dreamlax

1

Ecco un modo diverso di farlo con un po 'meno di battitura:

NSString *name = [NSArray description]; 
+7

Questo non è garantito per fare ciò che è richiesto. Questo metodo è comunemente sovrascritto per fornire una descrizione dell'oggetto e dei dati che contiene. –

+3

So che è sovrascritto come metodo INSTANCE ma quanto spesso viene sovrascritta la + descrizione CLASS METHOD? In ogni caso vale la pena considerare se non per ogni classe ... Non penso che sia stato richiesto un downgrade. –

+2

Oh, buon punto. :) –

0

prendere in considerazione questa alternativa:

const char *name = class_getName(cls); 

È molto più veloce, poiché non è necessario allocare oggetto NSString e convertire ASCII in qualsiasi rappresentazione di NSString. Ecco come viene implementato NSStringFromClass().