"Не удается найти объявление интерфейса для NSObject"? - PullRequest
12 голосов
/ 25 января 2012

Итак, я провел некоторое исследование по этому вопросу, но пока не нашел ничего похожего ...

Итак, я кодирую игру в Obj-C, используя Xcode и Sparrow Framework. До этого момента я работал над симулятором, и все шло отлично. Но когда я переключаюсь на запуск его на своем устройстве, я получаю всевозможные ошибки для вещей, которые должны быть стандартными, например «Не удается найти объявление интерфейса для NSObject», «Неизвестное имя типа« NSMutableArray »» и т. Д. У меня уже есть #import в каждом классе, так что вы думаете, что это не должно произойти, верно? У меня такое ощущение, что это просто строка или две, которые нужно где-то изменить, но я понятия не имею, что или где.

Если у кого-нибудь есть совет, он будет очень признателен. :)

РЕДАКТИРОВАТЬ: Вот снимок экрана с одним из файлов .h, которые выдают ошибки - похоже, он присутствует только в некоторых файлах .h, которые я создал. http://i.imgur.com/EuQh4.png

Ответы [ 7 ]

66 голосов
/ 24 ноября 2014

Это может быть вызвано отсутствием UIKit.

Добавить в шапку:

#include <UIKit/UIKit.h>

Также убедитесь, что добавили UIKit Framework в ваш проект. (Цели / Фазы сборки / Связать двоичные файлы с библиотеками / - Выберите Добавить --- Добавить UIKit.Framework)

45 голосов
/ 25 января 2012

Похоже, у вас может быть циклическая ссылка в одном из ваших заголовочных файлов.

Это может произойти, когда foo.h #imports "bar.h" и bar.h #imports "foo.h"(или иногда это цепочка из трех или более заголовочных файлов, импортирующих друг друга по кругу), и это приводит к ложным ошибкам, подобным той, которую вы видите.

Решение состоит в том, чтобы попытаться избежать импорта заголовков в вашфайлы .h, вместо этого используйте ссылки @class для внешних классов в файлах .h и поместите вместо них #imports в файлы .m.Поэтому вместо того, чтобы писать:

#import "SomeClass.h"

В ваших файлах .h по возможности вставьте:

@class SomeClass;

в ваш файл .h и поместите инструкцию #import в свой файл .mвместо этого.

7 голосов
/ 13 августа 2015

Попробуйте это вместо приложения для Какао или iOS, обязательно импортируйте "Foundation / Foundation.h" в свой класс, где вы наследуете класс NSObject.

4 голосов
/ 25 января 2012

Попробуйте удалить производные данные для проекта.Вы можете сделать это через организатора, в рамках проектов.Возможно, у вас поврежденный предварительно скомпилированный заголовок.

2 голосов
/ 04 мая 2018

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

В моем файле foo.m я забыл #import "foo.h"

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

0 голосов
/ 12 декабря 2017

Также убедитесь, что вы не включаете файл Objective-C из файла .cpp или .c.

Пример: PhotoManager.mm может включать заголовочный файл из пары Objective-C PhotoObject.h / PhotoObject.mm. Затем, если MyAwesomeCppFile.cpp включает PhotoManager.h, внезапно PhotoObject.h не знает основных классов Objective-C и ключевых слов.

Решением будет использование #ifdef __OBJC__, если вам это сойдет с рук.

В противном случае обозначьте тип файла .cpp как Objective-C++ Source на панели свойств файла (элемент управления в верхнем правом окне => «Идентификация и тип»)

0 голосов
/ 17 августа 2012

Убедитесь, что вы не используете имя класса, которое уже занято.У меня была такая же проблема, когда я назвал один из моих классов "Сигнал", который уже является частью Foundation.

...