ViewController может не отвечать на проблему «метода» - PullRequest
2 голосов
/ 16 ноября 2010

Я знаю, что это обычная проблема, я много гуглил и, похоже, не везет, чтобы решить мою проблему.У меня есть @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 ]

4 голосов
/ 16 ноября 2010

Ваши объявления метода отсутствуют в заголовке. Просто добавьте

-(void)method1;
-(void)method2;

в файл TestViewController.h

Обновление:

Причина, по которой вы не получаете предупреждение о втором вызове ([self method1] в методе 2), заключается в том, что компилятор уже знает о методе 1 в этот момент. (потому что реализация происходит перед method2)

1 голос
/ 16 ноября 2010

Objective-C так же, как C использует однопроходный компилятор для сбора всех известных символов. В результате вы можете ссылаться только на методы и переменные, которые были объявлены выше текущей области.

Вы можете решить эту конкретную проблему, приведенную в качестве примера, тремя способами:

Добавьте method1 к общедоступному интерфейсу в заголовочном файле, как и @weichsel.

Если вы хотите, чтобы method1 было private , вы можете добавить его в свой класс, объявив неназванную категорию в начале вашего файла реализации. Как это:

#import "Foo.h"
@interface Foo ()
-(void)method1;
@end

@implementation Foo
  // ... lots of code as usual ...
@end

Третий вариант может рассматриваться некоторыми как хакерский, но на самом деле это особенность языка Objective-C. Так же, как все методы получают неявную переменную с именем self, которая является экземпляром, к которому был вызван метод, так же, как и все методы, также получают неявную переменную с именем _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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...