отсутствуют @end ожидаемый идентификатор «{» ошибки в модуле XCode 4.2 .h

#objective-c #ios #xcode

#objective-c #iOS #xcode

Вопрос:

Я не могу избавиться от двух ошибок в моем модуле класса, даже когда я упростил код до минимального выражения:

 #import <Foundation/Foundation.h>

@interface MyClass : NSObject

@end
 

Обе ошибки сообщаются в строке @interface, и они:
— отсутствует @end
— ожидаемый идентификатор или «{»

Комментарии:

1. Похоже NSObject , что не определено

2. Вы в конечном итоге решили эту проблему? Я вижу это сейчас. Очистка, удаление производных данных … ничего не помогает!

3. компилятор может указать вам на совершенно неправильный файл. пройдите через все. файлы h и .m в вашем проекте и проверьте соответствие ‘@interface’ / ‘@end’, ‘@implementation’ /’@end’ и так далее. это происходит также, если вы по ошибке импортируете файл .m вместо .h (это случается)

4. WTF? Я все еще не могу решить эту проблему и схожу с ума, таких ошибок не должно быть в готовом продукте.

5. Я забыл добавить @end в один из моих заголовочных файлов (файл .h).

Ответ №1:

Проверьте файлы заголовков, которые #импортированы на той же странице, и убедитесь, что заголовки имеют соответствующие операторы @interface / @end .

У меня была та же проблема, и XCode сообщил, что в @implementation моего файла .m отсутствует оператор @end, даже когда я сократил его до простого:

 #import "MasterViewController.h"
#import "MyBadHeaderFile.h"
@implementation MasterViewController
@end
 

На самом деле ошибка заключалась в отсутствии @end в #imported MyBadHeaderFile .файл h.

Комментарии:

1. Думал, что схожу с ума, это была именно моя проблема. 1

2. точно так же и моя проблема, за исключением того, что ошибка попала в совершенно не связанный файл, который не был изменен и имел нулевой импорт, отличный от UIKit. благодаря git я смог просто просмотреть файлы, которые были изменены, и сузить их до того места, где они отсутствовали…

3. Я забыл добавить @end в один из моих заголовочных файлов (файл .h).

Ответ №2:

У меня была аналогичная проблема, добавление a } в мой код избавило меня от ошибок.

Перед добавлением } я получал следующие ошибки:

  1. непредвиденное @ в программе (проблема с синтаксическим анализом)
  2. Ожидается } (проблема с синтаксическим анализом)
  3. @end отсутствует в контексте реализации (семантическая проблема)

Ответ №3:

комментарий рокьярка должен быть правильным ответом:

1) компилятор может указать вам на совершенно неправильный файл. пройдите через все.файлы h и .m в вашем проекте и проверьте соответствие ‘@interface’ / ‘@end’, ‘@implementation’ /’@end’ и так далее.

2) это происходит также, если вы по ошибке импортируете файл .m вместо .h

Ответ №4:

Не имеет значения, в каком файле появляется ошибка. Обязательно проверьте все файлы, которые вы недавно изменили. Похоже, я скопировал файл из тестового проекта в свой реальный проект и забыл @end в одном из файлов. Это дало мне ошибку в совершенно не связанном файле .h.

Ответ №5:

Попробуйте удалить файл реализации этого класса из «Скомпилировать исходные коды в настройках проекта»

Ответ №6:

 @interface MyClass : NSObject{

}

@end
 

Комментарии:

1. Фигурные скобки на самом деле не нужны.

Ответ №7:

Я столкнулся с аналогичной проблемой, код был в порядке, но он выдавал эту ошибку.

В конце концов я решил это, очистив проект, вы пробовали это?

Ответ №8:

PEBKAC Отсутствие специфичности в строках статического анализатора

Существующие ответы, безусловно, полезны. Я просто хочу добавить общий PEBKAC, который вызывает это; а также подчеркнуть, что CLANG здесь должен быть понятнее. Кто-то со знанием предметной области должен подать патч, чтобы сделать сообщение об ошибке более понятным. n@endn Часть сообщения нелепа, несмотря ни на что.

(Отображение разрывов строк как n в сообщении, предназначенном для помощи пользователям графического интерфейса? Действительно ЛЯЗГ?)

Причина

Когда вы только что создали новый класс, файлы @interface amp; @implementation выглядят очень похожими, и Xcode автоматически поместит ваш курсор в реализацию.

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

Наглядный пример, показанный сразу

Отсутствие @end является случаем PEBKAC

Ответ №9:

У меня была такая же ошибка, и это было потому, что у меня

 @interface MyViewController ()
 

объявлено два раза в MyViewController.m