2012-01-24 3 views
9

Итак, я провел некоторое исследование этой проблемы, но пока не нашел ничего подобного ...«Не удается найти объявление интерфейса для NSObject»?

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

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

EDIT: Вот скриншот одного из файлов .h, которые дают ошибки - кажется, только в некоторых из файлов .h, которые я создал. http://i.imgur.com/EuQh4.png

+4

Похоже, Фонд не импортируется как-то. Попробуйте добавить '#import ' в свой префикс.pch, чтобы узнать, очищает ли оно предупреждения. –

+0

Только что выписал Application_Prefix.pch - он уже там, вместе с и "Sparrow.h" O.o –

+1

Является ли Фонд перечисленным в вашей папке фреймворков? Вы связываетесь с ним в своих целевых настройках? –

ответ

37

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

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

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

#import "SomeClass.h" 

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

@class SomeClass; 

В вашем файле .h и положить заявление #import в файле .m вместо этого.

+1

Привет, я выстрелил, и, похоже, это трюк для большинства этих ошибок, спасибо! Странно, но я проверил круглые ссылки и, похоже, не было ничего, что я мог бы видеть ... Кроме того, все еще, похоже, осталось немного (мы спустились с 20 + ошибок до 5), но я буду продолжать. Еще раз спасибо :) –

4

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

+0

Просто попробовал, хотя он не позволит мне удалить какие-либо производные данные. Кнопка села, так что я предполагаю, что там нет никого в первую очередь? –

+1

Итак, возможно, это не так, но на всякий случай перейдите в '/ Users//Library/Developer/Xcode/DerivedData' и найдите папку проекта и удалите ее. Безопасно удалять все папки здесь, если вы не уверены, какой из них правильный, Xcode просто должен будет переиндексировать ваши исходные файлы. – joerick

+0

Пошел, чтобы проверить это, но на нем не было данных. Это немного загадка! –

0

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

64

Это может быть вызвано не включением UIKit.

Добавьте это в заголовок:

#include <UIKit/UIKit.h> 

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

+2

Похоже, новый Xcode по умолчанию не включает инфраструктуру UIKit. –

+2

Да, это очень важно для Xcode 6 и iOS 8+ SDK. – Danoli3

+0

Вы экономите свое время, спасибо большое;) – mychar

7

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

0

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

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

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

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

Смежные вопросы