ViewController可能无法响应“方法”问题

时间:2010-11-16 08:00:20

标签: objective-c

我知道这是一个常见问题,我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
}

任何人都可以帮助我吗? 提前谢谢!

2 个答案:

答案 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
}