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
}