Classe Objective-C -> stringa come: [NSArray className] -> @ "NSArray"


128

Sto cercando di ottenere un nome stringa di una classe dall'oggetto classe stesso.

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

Ho trovato object_getClassName(id obj)ma ciò richiede che venga passata un'istanza, e nel mio caso si tratta di un lavoro inutile.

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

Risposte:


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

Puoi anche tornare indietro nell'altro modo:

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

Grazie! Come viene NSStringFromClassimplementato? È più efficace memorizzare il nome della classe in una static NSStringvariabile?
ma11hew28,

13
@MattDiPasquale: tutti i nomi delle classi sono memorizzati da qualche parte nel runtime Objective-C (gli interni del runtime sono per lo più nascosti dall'applicazione ed esposti solo attraverso alcune funzioni API). Ogni oggetto di classe (ad es. [NSArray class]) È in realtà a struct. Il file structcontiene molte informazioni sulla classe, incluso il suo nome, i metodi che implementa, la superclasse, ecc. NSStringFromClassSemplicemente estrae il nome della classe da questo structe lo converte in un NSString. Non memorizzare il nome della classe in a static NSString, non offrirà alcun vantaggio in termini di prestazioni.
dreamlax,

3
@MattDiPasquale: NSClassFromStringfunziona in modo leggermente diverso. Poiché tutti i nomi delle classi esistono da qualche parte nel runtime Objective-C, NSClassFromStringprende la stringa ed esplora l'elenco delle classi gestite dal runtime cercando la classe che ha il nome specificato. Se lo trova, lo restituisce, altrimenti ritorna Nil.
dreamlax,

2
@MattDiPasquale: "Come viene implementato NSStringFromClass?" se vuoi davvero saperlo, probabilmente lo utilizza class_getName()in fase di esecuzione, che restituisce una stringa C
user102008

2
@AlexZavatone: classNameè un metodo aggiunto dalle estensioni di scripting che è disponibile solo su Mac OS X, anche se è pignolo nel modo in cui funziona perché non è completamente documentato (o almeno non è stata l'ultima volta che ho controllato). NSStringFromClass()è il modo corretto di procedere.
dreamlax,

1

Ecco un modo diverso di farlo con una digitazione leggermente inferiore:

NSString *name = [NSArray description];

7
Non è garantito per fare ciò che è richiesto. Tale metodo viene comunemente ignorato per fornire una descrizione dell'oggetto e dei dati in esso contenuti.
Alex Wayne,

3
So che viene sovrascritto come metodo ISTANZA ma con quale frequenza viene sovrascritto il + description CLASS METHOD? In ogni caso vale la pena considerare se non per ogni classe ... Non credo che fosse richiesto un downgrade.
Sherwin Zadeh,

1
@SherwinZadeh: Penso che in pratica, è improbabile trovare classi che hanno scavalcato +description, tuttavia, in teoria, questo non è lo scopo +description, e quindi questo metodo è fragile per determinare i nomi delle classi.
dreamlax,

1

Considera questa alternativa:

const char *name = class_getName(cls);

È molto più veloce, poiché non è necessario allocare l'oggetto NSString e convertire ASCII in qualunque NSStringrappresentazione. Ecco come NSStringFromClass()viene implementato.


Questo mi è stato utile, ma era necessario aggiungere #import <objc / runtime.h> nella parte superiore del file.
Sparklellama,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.