2011-10-24 159 views
3

在Java中,我們可以實例化一個對象(只知道參數的類型)動態如下:動態實例化對象的Objective-C

Class<?> msgClass = Class.forName(className); 
      constructor = msgClass.getConstructor(String.class, String.class, 
        String.class);  
MyClass myClass = (MyClass) constructor.newInstance(myString, myString2, myString3); 


    pubic class MyClass{ 

     public MyClass(String s, String s2, String s2){} 
    } 

有沒有辦法做到在Objective-C一樣,只知道參數類型傳遞給objective-c類構造函數。

在此先感謝。

回答

5

是的,這取決於你真正在做什麼。 ObjC沒有以相同的方式具有語言級別的「構造函數」 - 有通常與實例化方法一起調用的init方法,但請注意,init存在於框架約定中,而不是由規範定義,因此運行時不「知道」你想要調用什麼「構造函數」。

可以實例化一個對象(分配它的等價物)這樣的:

id myObj = class_createInstance(NSClassFromString(@"MyClass")); 

雖然你還不如做更直接:

id myObj = [NSClassFromString(@"MyClass") alloc]; 

但你仍舊需要打電話給你想要的任何方法init。如果您不想直接執行此操作,則需要知道該方法的選擇器,以便可以向該對象發送正確的消息。選擇器是消息簽名的靜態表示。你可以通過運行時API像這樣調用該方法:

myObj = objc_msgSend(myObj, @selector(initWithStr1:str2:str3), myString1, myString2, myString3); 
// Check myObj for nil which means a failed init. 

ObjC運行時參考:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html

+0

所以,如果我不知道構造函數/方法/選擇器之類的名字,那麼我真的即使我知道參數,也無法調用它。有沒有根據可以採用的參數來查找選擇器? – Unis

+0

如果你知道參數,爲什麼你不知道選擇器?消息發送在Obj-C中是動態的,選擇器是*標識你正在調用的方法的東西*。 (它不像Java,你可以說「讓我有三個params的ctor」 - 可能有多個以「init ...」開頭的東西,看起來像這樣,你想知道哪個你打電話。)看看上面鏈接的運行時文檔。您可以使用'class_copyMethodList'函數遍歷方法,並檢查它們的名稱,選擇器和參數等。 –

+0

我同意你的觀點,我應該知道選擇器名稱,但是在我設計我的類的情況下具有相同名稱但不同參數類型的多個選擇器(init)正在被傳遞。我如何區分它們之間的區別?我希望我很清楚,並感謝您的幫助。 – Unis