2011-10-09 120 views
3

如果我在運行時動態生成方法,然後調用它們 - 我如何說服編譯器確信類將響應未聲明的(生成的)方法並使其不發出警告?Objective-C動態創建的方法和編譯器警告

更新關於答案

當我生成方法 - 他們的名字並不在編譯時已知。舉一個例子 - 如果我有一個視圖控制器MyFooController並且它是用方法initWithFoo:(Foo*)foo啓動的,我可以爲UINavigationController生成類似pushMyFooControllerWithFoo:(Foo *)foo的方法。因此,你注意到宣佈這種方法會適得其反。

回答

4

這並不直接回答你的問題,但如果我正在生成方法名稱(大概來自字符串),我會使用字符串名稱來調用它們,從而繞過編譯器警告。

[fooController performSelector:NSSelectorFromString(@"pushMyFooControllerWithFoo:") withObject:foo]; 

這樣你就負責生成的方法名的有效性。

1

那麼,如果你打電話給他們,你知道他們的簽名,如果你知道他們的簽名,你可以聲明他們,不是嗎?

+0

感謝您的意見。請閱讀更新。) – Eimantas

+0

您的更新似乎不夠。 *如果你可以打電話給他們,你可以聲明他們。所以告訴我們你是怎樣稱呼它們的,所以我們可以理解 –

+1

調用方法並不意味着在編譯時知道簽名,因此它並不意味着這種方法的可聲明性。 –

0

聲明的類別NSObject的這種方法,使空的實現:

@interface NSObject (DynamicMethodsCategory) 

- (void)doSomething; 

@end 

@implementation NSObject (DynamicMethodsCategory) 

- (void)doSomething 
{ 
} 

@end 

在你的對象,你可以調用它沒有任何警告:

@implementation MyObject 

- (void)someMethod 
{ 
    [self doSomething]; 
} 

@end 

然後生成執行[MyObject doSomething]動態,它將被調用而不是NSObject's之一。

更新: 或者,該方法可以在對象的類別中聲明。這抑制了編譯器的未完成實施警告。但是,我認爲這不是一個好的解決方法,因爲如果該方法不是在運行時動態創建的,而是在調用之前應用程序將會崩潰。

+0

感謝您的輸入。我已經更新了一個更詳細的問題。期待你的想法。) – Eimantas

+0

那麼,你知道編譯時的方法名稱嗎?如果不是,你怎麼讓編譯器警告你? – Davyd

3

由於您正在運行時添加方法,因此您還應該使用運行時函數objc_msgSendperformSelector:withObject:調用它們,例如,編譯器不會警告您任何事情。