คลาส Objective-C -> สตริงที่ต้องการ: [NSArray className] -> @“ NSArray”


128

ฉันพยายามรับชื่อสตริงของคลาสจากอ็อบเจกต์คลาสเอง

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

ฉันได้พบobject_getClassName(id obj)แต่ที่ต้องมีอินสแตนซ์ถูกส่งผ่านไปและในกรณีของฉันที่ไม่จำเป็นต้องทำงาน

ดังนั้นฉันจะได้รับสตริงจากวัตถุคลาสได้อย่างไรไม่ใช่ตัวอย่าง?

คำตอบ:


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

คุณสามารถย้อนกลับไปทางอื่นได้:

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

ขอบคุณ! มีNSStringFromClassการนำไปใช้อย่างไร มันมีประสิทธิภาพมากกว่าในการจัดเก็บชื่อคลาสในstatic NSStringตัวแปรหรือไม่?
ma11hew28

13
@MattDiPasquale: ชื่อคลาสทั้งหมดจะถูกเก็บไว้ที่ไหนสักแห่งใน Objective-C runtime (ภายในของรันไทม์ส่วนใหญ่จะถูกซ่อนจากแอปพลิเคชันและเปิดเผยผ่านฟังก์ชั่น API เพียงไม่กี่) วัตถุแต่ละระดับ (เช่น[NSArray class]) structเป็นจริง structมีข้อมูลจำนวนมากเกี่ยวกับการเรียนรวมทั้งชื่อของวิธีการที่จะนำไปปฏิบัติ, superclass ฯลฯNSStringFromClassเพียงแค่ดึงชื่อของชั้นนี้และแปลงไปยังstruct NSStringอย่าเก็บชื่อคลาสไว้ใน a static NSStringแต่จะไม่มีข้อได้เปรียบด้านประสิทธิภาพใด ๆ
Dreamlax

3
@MattDiPasquale: NSClassFromStringทำงานแตกต่างกันเล็กน้อย เนื่องจากชื่อคลาสทั้งหมดมีอยู่ที่ใดที่หนึ่งในรันไทม์ Objective-C NSClassFromStringรับสตริงและสำรวจรายการคลาสที่ดูแลโดยรันไทม์ที่กำลังค้นหาคลาสที่มีชื่อที่กำหนด Nilหากพบก็จะส่งกลับมันมิฉะนั้นก็จะส่งกลับ
Dreamlax

2
@MattDiPasquale: "NSStringFromClass มีการใช้งานอย่างไร" หากคุณต้องการทราบจริงๆมันอาจใช้class_getName()ในรันไทม์ซึ่งส่งคืนสตริง C
user102008

2
@AlexZavatone: classNameเป็นวิธีการที่เพิ่มขึ้นโดยส่วนขยายการเขียนสคริปต์ซึ่งมีเฉพาะใน Mac OS X แม้ว่าจะเป็นวิธีที่ใช้งานได้ดีเพราะไม่ได้รับการบันทึกอย่างสมบูรณ์ (หรืออย่างน้อยก็ไม่ใช่ครั้งสุดท้ายที่ฉันตรวจสอบ) NSStringFromClass()เป็นวิธีที่ถูกต้องที่จะไปเกี่ยวกับมัน
Dreamlax

1

นี่คือวิธีที่แตกต่างในการทำโดยพิมพ์น้อยลงเล็กน้อย:

NSString *name = [NSArray description];

7
ไม่รับประกันว่าจะทำตามที่ขอ วิธีการนั้นถูกแทนที่โดยทั่วไปเพื่อให้คำอธิบายของวัตถุและข้อมูลที่มี
Alex Wayne

3
ฉันรู้ว่ามันถูกแทนที่ด้วยวิธี INSTANCE แต่ความถี่ของ + description CLASS วิธีถูกแทนที่บ่อยแค่ไหน? ไม่ว่าในกรณีใด ๆ ควรพิจารณาว่าไม่ใช่สำหรับทุกชั้น ... ฉันไม่คิดว่าจะมีการลดระดับ
Sherwin Zadeh

1
@SherwinZadeh: ฉันคิดว่าในทางปฏิบัติคุณไม่น่าจะหาชั้นเรียนที่แทนที่ได้+descriptionอย่างไรก็ตามในทางทฤษฎีแล้วนี่ไม่ใช่จุดประสงค์ของการเรียน+descriptionดังนั้นวิธีการนี้จึงมีความเปราะบางในการกำหนดชื่อชั้นเรียน
dreamlax

1

พิจารณาทางเลือกนี้:

const char *name = class_getName(cls);

มันเร็วกว่ามากเนื่องจากมันไม่จำเป็นต้องจัดสรรวัตถุ NSString และแปลง ASCII ให้NSStringเป็นตัวแทนอะไรก็ได้ นั่นเป็นวิธีที่NSStringFromClass()จะนำไปใช้


สิ่งนี้มีประโยชน์สำหรับฉัน แต่จำเป็นต้องเพิ่ม #import <objc / runtime.h> ที่ด้านบนของไฟล์
Sparklellama
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.