2010-11-15 29 views
7

Có cách nào để #import một lớp từ một chuỗi trong Objective-C vào thời gian chạy không? Bất kỳ phương pháp nào có thể tạo ra một kết quả tương tự cũng sẽ được hoan nghênh.Tự động tải lớp trong mục tiêu-C?

Chỉnh sửa:

Tôi muốn truy cập vào một lớp có tên tôi xác định khi chạy. Vì vậy, một cái gì đó như thế này:

NSString *className = getClassName(); 
Class myClass = loadClass(className); 
myClass *myVar = [[myClass alloc] init]; 

Có cách nào để thực hiện việc này mà không đặt chỉ thị #import tĩnh cho myClass ở đầu tệp không?

Trả lời

5

Chỉ thị #import không "nhập khẩu" một lớp học - nó chèn văn bản từ các file có tên vào file hiện hành. Điều này rõ ràng là không hữu ích trong thời gian chạy sau khi nguồn đã được biên dịch.

Điều bạn muốn là tạo nhóm với các lớp và dynamically load the bundle. Để có thể nói chuyện với các lớp từ chương trình cốt lõi, có thể bạn sẽ muốn có một số giao thức chung mà các lớp được thực hiện.

+5

Tất nhiên, bạn không thể tải động gói cho iPhone. –

+0

@ Jason Coco: Phải không? NSBundle được ghi lại là hoạt động trên iOS. Miễn là bạn không tải xuống mã bên ngoài, tôi nghĩ bạn sẽ ổn thôi. – Chuck

+0

Dường như "gói có thể tải" là những gì tôi muốn và theo tài liệu của Apple "Việc tạo và sử dụng các gói có thể tải không được hỗ trợ trong iOS". Tôi đoán Apple không muốn mọi người tạo các khung công tác động tuyệt vời trên iOS như tôi muốn làm hoặc không hỗ trợ nó. –

25

Bạn có thể sử dụng phương thức NSClassFromString. Vì vậy:

// Creates an instance of an NSObject and stores it in anObject 
id anObject = [[NSClassFromString(@"NSObject") alloc] init]; 

Một số chi tiết mẫu mã để đáp ứng với chỉnh sửa của bạn:

NSString* myClassString = getClassName(); 
// if the class doesn't exist, myClass will be Nil and myVar will be nil 
Class* myClass = NSClassFromString(myClassString); 
id myVar = [[myClass alloc] init]; 
+0

Thật không may, điều này có vẻ như nó tạo ra một thể hiện của nil, khi tôi muốn tạo một thể hiện của myClass. Có lẽ điều này là không thể trong Objective-C? Trong Python, tôi có thể nạp các mô-đun một cách linh hoạt vào thời gian chạy tùy thuộc vào logic ứng dụng. Tôi đã hy vọng rằng có một cách để làm điều này trong Mục tiêu C. –

+0

@Jacob Lyles: 'NSClassFromString()' trả về nil nếu không tìm thấy lớp đó. Có vẻ như lớp học của bạn chưa được tải vào ứng dụng. Trong trường hợp đó, bạn có thể muốn xem câu trả lời của tôi. – Chuck

0

Cảm ơn Chuck đã chỉ cho tôi đúng đường dẫn, nhưng câu trả lời đúng cho truy vấn này có vẻ là không thể thực hiện trên iOS 4.1, mặc dù có thể với Mac OSX SDK hiện tại bằng gói có thể tải.

+0

nơi bạn đã đề cập rằng bạn đã hỏi về IOS 4.1 –

Các vấn đề liên quan