Câu trả lời:
id object = [[NSClassFromString(@"NameofClass") alloc] init];
NSClassFromString()
có nguy cơ gõ nhầm tên lớp hoặc sử dụng một lớp không tồn tại. Bạn sẽ không phát hiện ra cho đến thời gian chạy nếu bạn mắc lỗi đó. Thay vào đó, nếu bạn sử dụng kiểu target-c có sẵn của Class
để tạo một biến, thì trình biên dịch sẽ xác minh rằng lớp đó tồn tại.
Ví dụ, trong .h
:
@property Class NameOfClass;
và sau đó trong .m
:
id object = [[NameOfClass alloc] init];
Nếu bạn nhập sai tên lớp hoặc nếu nó không tồn tại, bạn sẽ gặp lỗi tại thời điểm biên dịch. Ngoài ra tôi nghĩ rằng đây là mã sạch hơn.
Nếu bạn đang làm việc với Objective-C mà không có NeXTstep
( OS X
, iOS
, GNUstep
hệ thống vv) hoặc bạn chỉ nghĩ rằng phương pháp này là sạch, sau đó bạn có thể sử dụng các API runtime thư viện của ngôn ngữ Objective-C . Dưới Objective-C 2.0
:
#import <objc/runtime.h>
//Declaration in the above named file
id objc_getClass(const char* name);
//Usage
id c = objc_getClass("Object");
[ [ c alloc ] free ];
Trong Objective-C (phiên bản 1.0 hoặc chưa được đặt tên), bạn sẽ sử dụng những điều sau:
#import <objc/objc-api.h>
//Declaration within the above named file
Class objc_get_class( const char* name);
//Usage
Class cls = objc_get_class( "Test" );
id obj = class_create_instance( cls );
[ obj free ];
Tôi chưa thử nghiệm 1.0
phiên bản, tuy nhiên tôi đã sử dụng 2.0
hàm trong mã hiện đang được sản xuất. Cá nhân tôi tin rằng việc sử dụng 2.0
hàm này sẽ sạch hơn nếu có sẵn so với hàm NS vì nó tốn ít dung lượng hơn: the length of the name in bytes + 1 ( null terminator )
đối với API 2.0 so với the sum of two pointers (isa, cstring)
, a size_t length (cstring_length)
và length of the string in bytes + 1
đối với NeXTSTEP
API.