2011-10-09 122 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:调用它们,例如,编译器不会警告您任何事情。