如果我在运行时动态生成方法然后调用它们 - 我怎样才能说服编译器该类将响应未声明的(生成的)方法并使其不发出警告?
有关答案的更新
当我生成方法时 - 在编译时不知道它们的名称。举个例子 - 如果我有一个视图控制器MyFooController
并且它是用方法initWithFoo:(Foo*)foo
启动的,那么我就可以为pushMyFooControllerWithFoo:(Foo *)foo
生成类似UINavigationController
的方法。因此,您注意到声明此类方法会适得其反。
答案 0 :(得分:4)
这并没有直接回答你的问题,但如果我正在生成方法名称(可能来自字符串),我会使用字符串名称来调用它们,从而绕过编译器警告。
[fooController performSelector:NSSelectorFromString(@"pushMyFooControllerWithFoo:") withObject:foo];
这样您就要对生成的方法名称的有效性负责。
答案 1 :(得分:3)
由于您是在运行时添加方法,因此您还应该使用运行时函数objc_msgSend
或performSelector: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
。
更新: 或者,可以在对象的类别中声明该方法。这会抑制编译器的不完整实现警告。但是,我认为这不是一个好的解决方法,因为如果方法在调用之前没有在运行时动态创建,应用程序将崩溃。