2009-05-26 91 views
3

實施例:我該如何動態創建一個類的實例?

我有10個視圖控制器,它們都分配並以同樣的方式初始化:

UIViewController *controller = [[MyViewController alloc] initWithNib]; 

(注意-initWithNib是UIViewController子類的一個自定義的方法)

下一個視圖控制器類是OtherViewController,依此類推。我想在我需要的時候懶洋洋地加載視圖控制器。但要做到這一點,我需要有一些「數組」,它會給我一個給定索引的相應類,以便我可以初始化它。

我最終創建了一個帶有大開關語句的方法,它將爲每個視圖控制器分別執行那些令人討厭的分配和初始化。我對此不滿意。如果我可以將適當的類分配給一個變量,那麼會更好,然後在switch語句的末尾,只需從變量中分配並初始化該類。

有沒有辦法做到這一點?

編輯:我發現了一個功能

id class_createInstance(Class cls, size_t extraBytes) 

,每類似乎有一個屬性「類」。但是我不能將它分配給一個實例變量。這是行不通的:

Class cls = [UIImage class]; 
cls *image = [cls imageNamed:@"avatar.png"]; 

第一行編譯。但第二個提供了一個錯誤:「圖像未聲明」。

+3

看起來像一個確切的副本http://stackoverflow.com/questions/381793 – smorgan 2009-05-26 20:30:31

+1

我編輯了我的答案,包括一個基本的工廠模式。你想這樣做:id image = [cls imageNamed:@「avatar.png」]。但是,最好在這裏使用通用的基本類型(即UIImage * image = ...),因爲問題的第一部分表明情況就是這樣。 – Jason 2009-05-26 20:51:49

回答

13

如果您在編譯時知道類的名稱,則可以將這些類分配給類變量。例如:

static Class factory[2]; 

factory[0] = [MyViewController1 class]; 
factory[1] = [MyViewController2 class]; 
... 

然後,你可以有(的classid將是在編譯時已知的常數,將映射到一個期望的類:

-(UIViewController*)createViewController:(int)classid 
{ 
    return [[factory[classid] alloc] init]; 
} 

假設方法在類名爲MyFactory被定義,那麼你可以這樣做:

MyFactory * fac = [[MyFactory alloc] init]; 
UIViewController * v1 = [fac createViewController: 0]; // typed 
id v2 = [fac createViewController: 1]; // untyped 

如果你沒有類的編譯時的名字,你可以簡單地做到以下幾點:

#include <objc/objc-runtime.h> 

id object = [[NSClassFromString(@"TheClassName") alloc] init]; 

由於您的原始問題涉及到一組UIViewControllers,所以沒有理由使用後一種方法丟失類型安全。

0

你想要的是反射。儘管沒有Objective-C的概念 - 但該術語可能會幫助Google更好地回答您的答案。

+0

-1讓我休息一下 - 這是一個完全正確的答案,也是一小時後的唯一答案。僅僅因爲你不知道一種特定的語言並不意味着一個答案是不正確的 - 它可以幫助另一個用戶回答這個問題。這個網站上的一些人需要不那麼認真,或者找到新的愛好。 – Gandalf 2009-05-26 23:38:49

0

的Objective C的參考也將是一個很好的地方尋找到這些來電。嘗試搜索Objective-C 2.0運行時參考,因爲我無法添加鏈接