Objective-C动态创建方法和编译器警告

时间:2011-10-09 08:30:30

标签: objective-c metaprogramming objective-c-runtime

如果我在运行时动态生成方法然后调用它们 - 我怎样才能说服编译器该类将响应未声明的(生成的)方法并使其不发出警告?

有关答案的更新

当我生成方法时 - 在编译时不知道它们的名称。举个例子 - 如果我有一个视图控制器MyFooController并且它是用方法initWithFoo:(Foo*)foo启动的,那么我就可以为pushMyFooControllerWithFoo:(Foo *)foo生成类似UINavigationController的方法。因此,您注意到声明此类方法会适得其反。

4 个答案:

答案 0 :(得分:4)

这并没有直接回答你的问题,但如果我正在生成方法名称(可能来自字符串),我会使用字符串名称来调用它们,从而绕过编译器警告。

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

这样您就要对生成的方法名称的有效性负责。

答案 1 :(得分:3)

由于您是在运行时添加方法,因此您还应该使用运行时函数objc_msgSendperformSelector:withObject:来调用它们,因此编译器不会向您发出任何警告。

答案 2 :(得分:1)

好吧,如果你打电话给他们,你知道他们的签名,如果你知道他们的签名,你可以申报他们,不是吗?

答案 3 :(得分: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

更新: 或者,可以在对象的类别中声明该方法。这会抑制编译器的不完整实现警告。但是,我认为这不是一个好的解决方法,因为如果方法在调用之前没有在运行时动态创建,应用程序将崩溃。