2011-02-14 36 views
3

我正在寫代理對象的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

協議不被在運行時 協議對象表示。

+0

爲什麼你需要讓你的應用程序不使用的協議地方? – JeremyP 2011-02-14 16:54:39

+0

我在運行時創建代理對象,使它們符合我的預定義協議。這些協議反過來充當模板,以便在服務器上調用哪些方法(實際上是服務器上的相應對象)。所以我使用這些協議,但我沒有定義在頭文件中使用它們的類。我的想法是用`BOOL class_addProtocol(Class cls,Protocol * protocol)`將協議添加到我的遠程對象中,但由於我無法創建任何`Protocol *`對象,所以我運氣不好。 – alleus 2011-02-14 21:26:23

回答

4

由於您的協議#import版,簡單地做一個@protocol(MyProtocolName)在編譯的代碼的某個地方應該足以確保Protocol對象存在在運行時。也許一個很好的方法是創建一個靜態的NSDictionary,從已知協議名稱映射到Protocol對象。基本上你會爲你的已知協議重新實現NSProtocolFromString,但它保證這些協議對象將被編譯。即是這樣的:

+ (Protocol)remoteProtocolForName:(NSString *)name 
{ 
    static NSDictionary *dict = nil; 
    if (!dict) 
    { 
     dict = [[NSDictionary alloc] initWithObjectsAndKeys: 
       @protocol(Foo), @"Foo", 
       ...]; 
    } 
    return [dict objectForKey:name]; 
} 

它發生,我現在我不知道,你可以存儲Protocol S IN的NSDictionary ...

相關問題