2010-11-15 45 views
7

有沒有辦法在運行時從Objective-C的字符串中導入類?任何可能產生相似結果的方法都會受到歡迎。在Objective-C中動態加載類?

編輯:

我想訪問類的名字我在運行時確定。因此,像這樣:

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

有沒有辦法做到這一點不把靜態#import指令爲myClass的在文件的頂部?

回答

5

#import指令沒有「進口」一類 - 它插入從命名的文件中的文本到當前文件。在編譯源代碼後,這在運行時顯然沒有用。

你想要的是創建一個包含類和dynamically load the bundle的包。爲了能夠與核心程序中的類進行交談,您可能希望擁有一些捆綁類實現的通用協議。

+5

當然,你不能動態地加載iPhone的包。 – 2010-11-15 20:26:10

+0

@Jason Coco:不是嗎? NSBundle被記錄爲在iOS上工作。只要你不下載外部代碼,我會認爲你會沒事的。 – Chuck 2010-11-16 00:37:19

+0

它看起來像「可裝載捆綁」是我想要的,並根據Apple文檔「iOS中不支持可裝載捆綁的創建和使用」。我猜蘋果不希望人們在iOS上製作酷炫的動態框架,就像我想要的那樣,或者不支持它。 – 2010-11-16 00:56:33

25

您可以使用NSClassFromString方法。所以:在回答您的編輯

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

一些更多的示例代碼:

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

不幸的是,這看起來像創建了一個nil的實例,當我想創建一個myClass的實例時。也許這在Objective-C中是不可能的?在Python中,我可以根據應用程序邏輯在運行時動態加載模塊。我希望有一種方法可以在Objective C中做到這一點。 – 2010-11-16 00:09:05

+0

@Jacob Lyles:如果找不到這樣的類,'NSClassFromString()'返回nil。這聽起來像你的課沒有加載到應用程序。在這種情況下,你可能想看到我的答案。 – Chuck 2010-11-16 00:38:29

0

感謝查克指出我在正確的道路上,但這個查詢的正確答案似乎是,它是不可能在iOS 4.1上,雖然它可能與當前的Mac OSX SDK使用可加載的包。

+0

你在哪裏提到你在問IOS 4.1? – 2014-01-31 10:49:36