我知道这是一个常见问题,我google了很多,似乎没有运气来解决我的问题。 我有一个@interface TestViewController:UIViewController 并在其实现文件中我定义了一个方法:
-(void)method1 {
do something;
[self method1];//here I need to call the method itself if a statement is true and this line is where the warning TestViewController may not respond to'method1' I got
}
-(void)method2{
[self method1] //But there is no problem with this line
}
任何人都可以帮助我吗? 提前谢谢!
答案 0 :(得分:4)
标题中缺少方法声明。 只需添加
-(void)method1;
-(void)method2;
到你的TestViewController.h文件
更新:
您没有收到有关第二次调用(method2中的[self method1]
)的警告的原因是,编译器已经知道了此时的method1。 (因为实现发生在method2之前)
答案 1 :(得分:1)
Objective-C就像C使用单通道编译器来收集所有已知符号一样。结果是您只能引用已在当前范围之上声明的方法和变量。
您可以用三种方式解决这个特殊问题:
将method1
添加到头文件中的公共接口,就像@weichsel建议的那样。
如果您希望method1
成为私有,则可以通过在实现文件顶部声明未命名的类别将其添加到您的类中。像这样:
#import "Foo.h"
@interface Foo ()
-(void)method1;
@end
@implementation Foo
// ... lots of code as usual ...
@end
第三种选择可能被一些人视为黑客,但它确实是Objective-C语言的一个特征。就像所有方法都得到一个名为self
的隐式变量一样,该方法被调用的实例,所有方法alsa都得到名为_cmd
的隐式变量,类型为SEL
,它是用于调用此方法的选择器。这可用于再次快速调用相同的方法:
-(void)method1 {
if (someContition) {
[self performSelector:_cmd withObject:nil];
} else {
// Do other stuff...
}
}
如果要确保始终在主线程上执行特定方法,这将非常有用:
-(void)method {
if (![NSThread isMainThread]) {
[self performSelectorOnMainThread:_cmd withObject:nil waitUntilDone:NO];
return;
}
// Do stuff only safe on main thread
}