Kelas Objective-C -> string seperti: [NSArray className] -> @ "NSArray"

128

Saya mencoba untuk mendapatkan nama string suatu kelas dari objek kelas itu sendiri.

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

Saya telah menemukan object_getClassName(id obj)tetapi itu membutuhkan contoh yang diberikan, dan dalam kasus saya itu adalah pekerjaan yang tidak perlu.

Jadi bagaimana saya bisa mendapatkan string dari objek kelas, dan bukan contoh?

Alex Wayne
sumber

Jawaban:

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

Anda bahkan dapat kembali dengan cara lain:

Class arrayClass = NSClassFromString (name);
id anInstance = [[arrayClass alloc] init];
dreamlax
sumber
Terima kasih! Bagaimana NSStringFromClasspenerapannya? Apakah lebih berkinerja untuk menyimpan nama kelas dalam suatu static NSStringvariabel?
ma11hew28
13
@MattDiPasquale: Semua nama kelas disimpan di suatu tempat di runtime Objective-C (internal runtime sebagian besar disembunyikan dari aplikasi dan diekspos hanya melalui beberapa fungsi API). Setiap objek kelas (misalnya [NSArray class]) sebenarnya a struct. Ini structberisi banyak informasi tentang kelas, termasuk namanya, metode yang diterapkannya, superclass, dll. NSStringFromClassHanya menarik nama kelas dari ini structdan mengubahnya menjadi NSString. Jangan menyimpan nama kelas dalam a static NSString, itu tidak akan menawarkan keuntungan kinerja apa pun.
dreamlax
3
@MattDiPasquale: NSClassFromStringbekerja sedikit berbeda. Karena semua nama kelas ada di suatu tempat di runtime Objective-C, NSClassFromStringambil string dan jelajahi daftar kelas yang dikelola oleh runtime mencari kelas yang memiliki nama yang diberikan. Jika menemukannya, mengembalikannya, jika tidak kembali Nil.
dreamlax
2
@MattDiPasquale: "Bagaimana NSStringFromClass diimplementasikan?" jika Anda benar-benar ingin tahu, ini mungkin menggunakan class_getName()runtime, yang mengembalikan string C
user102008
2
@AlexZavatone: classNameadalah metode yang ditambahkan oleh ekstensi skrip yang hanya tersedia di Mac OS X, meskipun itu sangat rewel dalam cara kerjanya karena tidak sepenuhnya didokumentasikan (atau setidaknya itu bukan terakhir kali saya memeriksa). NSStringFromClass()adalah cara yang tepat untuk melakukannya.
dreamlax
1

Berikut cara yang berbeda untuk melakukannya dengan mengetik yang sedikit kurang:

NSString *name = [NSArray description];
Sherwin Zadeh
sumber
7
Itu tidak dijamin untuk melakukan apa yang diminta. Metode itu biasanya digunakan secara berlebihan untuk memberikan deskripsi objek dan data yang dikandungnya.
Alex Wayne
3
Saya tahu ini ditimpa sebagai metode INSTANCE tapi seberapa sering + deskripsi METODE CLASS ditimpa? Dalam hal apa pun, ada baiknya mempertimbangkan jika tidak untuk setiap kelas ... Saya tidak berpikir downgrade diperlukan.
Sherwin Zadeh
1
@ SherwinZadeh: Saya pikir dalam praktiknya, Anda tidak mungkin menemukan kelas yang telah ditimpa +description, namun, secara teori, ini bukan tujuan +description, dan metode ini rapuh untuk menentukan nama kelas.
dreamlax
1

Pertimbangkan alternatif ini:

const char *name = class_getName(cls);

Ini jauh lebih cepat, karena tidak harus mengalokasikan objek NSString dan mengubah ASCII menjadi NSStringrepresentasi apa pun . Begitulah cara NSStringFromClass()diterapkan.

wonder.mice
sumber
Ini berguna bagi saya, tetapi perlu menambahkan #import <objc / runtime.h> di bagian atas file.
Sparklellama