Objective-C sınıfı -> string gibi: [NSArray className] -> @ "NSArray"


128

Sınıf nesnesinin kendisinden bir sınıfın dize adını almaya çalışıyorum.

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

Buldum object_getClassName(id obj)ama bu ona bir örnek aktarılmasını gerektiriyor ve benim durumumda bu gereksiz bir iş.

Öyleyse bir sınıf nesnesinden nasıl bir dizge alabilirim, bir örnekten değil ?

Yanıtlar:


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

Hatta diğer yoldan geri dönebilirsiniz:

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

Teşekkürler! Nasıl NSStringFromClassuygulanır? Sınıf adını bir static NSStringdeğişkende saklamak daha performanslı mıdır ?
ma11hew28

13
@MattDiPasquale: Tüm sınıf adları Objective-C çalışma zamanında bir yerde saklanır (çalışma zamanının iç öğeleri çoğunlukla uygulamadan gizlenir ve yalnızca birkaç API işlevi aracılığıyla görünür). Her sınıf nesnesi (örneğin [NSArray class]) aslında bir struct. structSınıf hakkında birçok bilgi içeren vb adını, yöntemleri bu uygular, üst sınıf dahil NSStringFromClasssadece bundan sınıfın adını çeker structbir etmek ve dönüşüm o NSString. Sınıf adını a içinde saklamayın, static NSStringherhangi bir performans avantajı sağlamaz.
dreamlax

3
@MattDiPasquale: NSClassFromStringbiraz farklı çalışır. Tüm sınıf adları Objective-C çalışma zamanında bir yerde bulunduğundan, NSClassFromStringdizeyi alır ve verilen ada sahip sınıfı arayan çalışma zamanı tarafından tutulan sınıfların listesini araştırır. Bulursa, döndürür, yoksa geri döner Nil.
dreamlax

2
@MattDiPasquale: "NSStringFromClass nasıl uygulanır?" Gerçekten bilmek istiyorsanız, muhtemelen class_getName()çalışma zamanında kullanır , bu da bir C dizesi döndürür
user102008

2
@AlexZavatone: classNameyalnızca Mac OS X'te bulunan komut dosyası uzantıları tarafından eklenen bir yöntemdir, o zaman bile tam olarak belgelenmediği için nasıl çalıştığı konusunda titizdir (veya en azından son kontrol ettiğimde değildi). NSStringFromClass()bunun için doğru yol.
dreamlax

1

İşte bunu biraz daha az yazarak yapmanın farklı bir yolu:

NSString *name = [NSArray description];

7
İsteneni yapacağı garanti edilmez. Bu yöntem, nesnenin ve içerdiği verilerin bir açıklamasını sağlamak için genellikle geçersiz kılınır.
Alex Wayne

3
INSTANCE yöntemi olarak geçersiz kılındığını biliyorum, ancak + açıklama SINIFI YÖNTEMİ ne sıklıkla geçersiz kılınır? Her halükarda, her sınıf için olmasa da dikkate almaya değer ... Bir not düşürmenin gerekli olduğunu düşünmüyorum.
Sherwin Zadeh

1
@SherwinZadeh: Pratikte, geçersiz kılınmış sınıfları bulmanız pek olası değil +description, ancak teoride amaç bu değil +descriptionve bu nedenle bu yöntem sınıf adlarını belirlemek için kırılgan.
dreamlax

1

Şu alternatifi düşünün:

const char *name = class_getName(cls);

NSString nesnesini tahsis etmesi ve ASCII'yi NSStringtemsil edilen biçime dönüştürmesi gerekmediği için çok daha hızlıdır . Bu nasıl NSStringFromClass()uygulanır.


Bu benim için faydalı oldu, ancak dosyanın en üstüne #import <objc / runtime.h> eklemesi gerekiyordu.
Sparklellama
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.