Lớp Objective-C -> chuỗi như: [NSArray className] -> @ phiên NSArray341


128

Tôi đang cố gắng để có được một tên chuỗi của một lớp từ chính đối tượng lớp.

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

Tôi đã tìm thấy object_getClassName(id obj)nhưng điều đó đòi hỏi một thể hiện được truyền cho nó, và trong trường hợp của tôi đó là công việc không cần thiết.

Vậy làm thế nào tôi có thể nhận được một chuỗi từ một đối tượng lớp chứ không phải một thể hiện?

Câu trả lời:


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

Bạn thậm chí có thể quay lại theo cách khác:

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

Cảm ơn! Làm thế nào được NSStringFromClassthực hiện? Là nó hiệu quả hơn để lưu trữ tên lớp trong một static NSStringbiến?
ma11hew28

13
@MattDiPasquale: Tất cả các tên lớp được lưu trữ ở đâu đó trong thời gian chạy Objective-C (phần bên trong của thời gian chạy hầu hết được ẩn khỏi ứng dụng và chỉ được hiển thị thông qua một vài hàm API). Mỗi đối tượng lớp (ví dụ [NSArray class]) thực sự là a struct. Nó structchứa rất nhiều thông tin về lớp, bao gồm tên của nó, các phương thức mà nó thực hiện, siêu lớp, v.v. NSStringFromClasschỉ cần lấy tên của lớp từ cái này structvà chuyển nó thành một NSString. Không lưu tên lớp trong một static NSString, nó sẽ không cung cấp bất kỳ lợi thế hiệu suất.
dreamlax

3
@MattDiPasquale: NSClassFromStringhoạt động hơi khác một chút. Vì tất cả các tên lớp tồn tại ở đâu đó trong thời gian chạy Objective-C, NSClassFromStringlấy chuỗi và khám phá danh sách các lớp được duy trì bởi thời gian chạy tìm kiếm lớp có tên đã cho. Nếu nó tìm thấy nó, nó trả về nó, nếu không nó trả lại Nil.
dreamlax

2
@MattDiPasquale: "NSStringFromClass được triển khai như thế nào?" nếu bạn thực sự muốn biết, nó có thể sử dụng class_getName()trong thời gian chạy, trả về chuỗi C
user102008

2
@AlexZavatone: classNamelà một phương thức được thêm vào bởi các tiện ích mở rộng tập lệnh chỉ có trên Mac OS X, thậm chí nó còn rất khó sử dụng vì nó không được ghi lại đầy đủ (hoặc ít nhất đó không phải là lần cuối tôi kiểm tra). NSStringFromClass()là cách chính xác để đi về nó.
dreamlax

1

Đây là một cách khác để làm điều đó với cách gõ ít hơn một chút:

NSString *name = [NSArray description];

7
Điều đó không được đảm bảo để làm những gì được yêu cầu. Phương pháp đó thường được áp dụng để cung cấp một mô tả về đối tượng và dữ liệu mà nó chứa.
Alex Wayne

3
Tôi biết nó bị ghi đè như một phương thức INSTANCE nhưng tần suất + mô tả PHƯƠNG PHÁP LỚP được ghi đè? Trong mọi trường hợp, nó đáng để xem xét nếu không phải cho mọi lớp học ... Tôi không nghĩ rằng việc hạ cấp được yêu cầu.
Sherwin Zadeh

1
@SherwinZadeh: Tôi nghĩ trong thực tế, bạn khó có thể tìm thấy các lớp đã bị ghi đè +description, tuy nhiên, về mặt lý thuyết, đây không phải là mục đích +descriptionvà vì vậy phương pháp này rất mong manh để xác định tên lớp.
dreamlax

1

Hãy xem xét sự thay thế này:

const char *name = class_getName(cls);

Nó nhanh hơn nhiều, vì nó không phải phân bổ đối tượng NSString và chuyển đổi ASCII thành bất kỳ NSStringđại diện nào . Đó là cách NSStringFromClass()thực hiện.


Điều này hữu ích cho tôi, nhưng cần thêm #import <objc / runtime.h> ở đầu tệp.
Sparklellama
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.