我正在寫代理對象的RPC實現(想想NSDistantObject)。在執行此操作時,我們直接從服務器實現中生成頭文件(包括DTO:和協議)。我在運行時動態地創建對象,但是我遇到了一個特定的問題。如何讓我的iPhone應用程序動態加載協議?
當遇到一個對象時,我的名字是一個字符串,我從那裏弄清楚如何處理它。當我試圖「查詢」系統中沒有在代碼中任何地方使用的協議時,我的問題就會出現。頭文件在那裏,甚至#import
:編。
一些例子...
這個偉大的工程:
Protocol *protocol = NSProtocolFromString(@"UIApplicationDelegate"); // Returns a protocol
如果我把我自己的協議之一,並指定我的應用程序委託應遵守它,它也可以沒有任何問題:
@interface ApplicationDelegate : NSObject <UIApplicationDelegate, ACMyCustomProtocol> {
}
// Implementation...
Protocol *protocol = NSProtocolFromString(@"ACMyCustomProtocol"); // Returns a protocol
但是,如果我問一個協議,這在我的項目沒有階級符合,我得到nil
:
Protocol *protocol = NSProtocolFromString(@"ACMyCustomProtocolNotMentionedAnywhere"); // Returns nil
我試着改變了構建配置(認爲Xcode可能會在構建時剝離未使用的代碼)而沒有運氣。也試過Protocol *objc_getProtocol(const char *name)
沒有運氣。
編輯:
我從在開發者論壇是一種用戶小費,不幸的是,這可能意味着我的運氣。被聲明但不 使用(除了類型檢查如下所述 )
The Objective-C Programming Language: Protocols
協議不被在運行時 協議對象表示。
爲什麼你需要讓你的應用程序不使用的協議地方? – JeremyP 2011-02-14 16:54:39
我在運行時創建代理對象,使它們符合我的預定義協議。這些協議反過來充當模板,以便在服務器上調用哪些方法(實際上是服務器上的相應對象)。所以我使用這些協議,但我沒有定義在頭文件中使用它們的類。我的想法是用`BOOL class_addProtocol(Class cls,Protocol * protocol)`將協議添加到我的遠程對象中,但由於我無法創建任何`Protocol *`對象,所以我運氣不好。 – alleus 2011-02-14 21:26:23