"Нет видимого @interface для" BlahDataController "объявляет селектор" aMethod: ""
Простой пример моей проблемы:
"Внутри BlahDataController.h"
@interface BlahDataController : NSObject
-(NSString *)aMethod:(NSString *)theString;
@end
"Внутри BlahDataController.m"
#import "BlahDataController.h"
@implementation BlahDataController
-(NSString *)aMethod:(NSString *)theString
{
return @"Something";
}
@end
"Внутри BobViewController.h"
@interface BobViewController : NSObject
-(void)aMethodOfSomeSort;
@end
"Внутри BobViewController.m"
#import "BobViewController.h"
#import "BlahDataController.h"
@implementation BobViewController
-(void)aMethodOfSomeSort
{
BlahDataController *blahDataController = [[BlahDataController alloc] init];
NSLog(@"%@",[blahDataController aMethod:@"Variable"]);
}
@end
В строке "NSLog (@" % @ ", [blahDataController aMethod: @" Variable "]); Я получаю сообщение об ошибке:" Нет видимого @interface для "BlahDataController" объявляет селектор "aMethod:"
Кто-нибудь знает, почему эта ошибка возникает?
- = - = - = - = - = - = - = - = - = - = -
Дело в том, что в моей реальной программе у меня есть эта же реализация, и она отлично работает для сотен методов, созданных таким образом. Однако каждый раз так часто я получаю эту ошибку по вновь созданному методу. Я не поступил иначе. Он просто не узнает это вновь созданное существование.
- = - = - = - = - = - = - = - = - = - = -
Вот как я сейчас обхожу это, хотя я понятия не имею, почему компилятор принимает этот способ, но не другой:
Измените BobViewController.m:
#import "BobViewController.h"
#import "BlahDataController.h"
#import "AnotherDataController.h"
@implementation BobViewController
-(void)aMethodOfSomeSort
{
BlahDataController *blahDataController = [[BlahDataController alloc] init];
AnotherDataController *anotherDataController = [[AnotherDataController alloc] init];
[anotherDataController fixedMethod:blahDataController theString:@"Variable"];
}
@end
"Внутри AnotherDataController.h"
@interface AnotherDataController : NSObject
-(void)fixedMethod:(BlahDataController *)blahDataController theString:(NSString *)theString;
@end
"Внутри AnotherDataController.m"
#import "AnotherDataController.h"
#import "BlahDataController.h"
@implementation AnotherDataController
-(void)fixedMethod:(BlahDataController *)blahDataController theString:(NSString *)theString
{
NSLog(@"%@",[blahDataController aMethod:theString]);
}
@end
И... он работает просто отлично... Поэтому я считаю, что xcode просто не распознает метод в одном классе и работает так, как должен, в другом... Человек, я понятия не имею, почему эта ошибка происходит...
- = - = -
Незначительное обновление:
Выполнение всего "xcode dance" не решило проблему
1) Чистое строительство
2) Удалить производные данные
3) Полностью закрыть XCode и снова открыть
Ответы
Ответ 1
Хорошо, для всех в будущем с этой проблемой; это проблема.
Я сделал BlahDataController несколько месяцев назад. Примерно неделю назад я перестроил папки проекта и переместил BlahDataController из папки под названием "Бла" в другую папку под названием "Данные" .
Когда я изменил код для BlahDataController в папке "Данные" , один из моих классов мог видеть измененный код, однако другой класс не смог.
В результате проблема заключалась в том, что когда я переместил BlahDataController, она фактически создала ее копию. Таким образом, у меня был BlahDataController в папке "Данные" и более старый BlahDataController в папке "Blah". Хотя старый BlahDataController больше не привязан к проекту в менеджере проектов (слева от xcode), тот факт, что физический файл все еще существовал в папке, вызвал эту проблему.
После удаления дублированной более старой копии BlahDataController проблема была решена.
tl; dr - Там где-то в проекте дублируется файл! Иди охотиться и уничтожить его безжалостно!
Ответ 2
Если кто-то сталкивается с подобной проблемой, в моем случае я сделал несколько рефакторингов с использованием функции "Найти и заменить" (игнорируя случай), и я получил что-то вроде этого:
SomeClass* SomeClass = [[SomeClass alloc] init];
[SomeClass instanceMethod];
и он говорил: "Нет видимого @interface для" SomeClass "объявляет метод" alloc ". Поэтому в моем случае проблема заключалась в том, что я переименовал переменную экземпляра в верхний регистр. Решение было:
SomeClass* SomeClass = [[SomeClass alloc] init];
[SomeClass instanceMethod];
PS: Я рекомендую использовать функцию "Refactor" в Xcode вместо "Найти и заменить", если это возможно.
Ответ 3
Примечание: не ответ на этот точный вопрос, но я нашел здесь ту же ошибку компилятора.
Убедитесь, что вы знаете, вызываете ли вы метод экземпляра или статический метод:
@interface SomeClass
+(void) SomeMethod;
против.
-(void) SomeMethod;
Это разные.
[SomeClass SomeMethod];
против.
[[[SomeClass alloc] init] SomeMethod];
Ответ 4
Также обратите внимание, что это может произойти (например, с шаблоном проекта мастера/детали), если
"Other Linker Flags"
Значение установлено на
-ObjC
как того требуют некоторые структуры, например. RestKit (проблема на странице RestKits github: https://github.com/RestKit/RestKit/issues/1153)
Ответ 5
Да, у меня была такая же проблема. У меня была эта идеальная работа в моей Платной цели, хотя, когда я перешел на мою свободную цель, я получил эту ошибку.
Нет видимого @interface для 'GameOverScene' объявляет селектор mesageToDisplayOnLabel:
-
чтобы исправить это, написание моего вызова метода было отличным от метода, который я вызывал.
- (void) messageToDisplayOnLabel//Мне не хватает s в "сообщении" в вызове метода Doh!
{
// код метода
}
-
Проверьте правильность написания метода, который вы вызываете.