«Не удается найти ошибку объявления интерфейса ...» после @class - PullRequest
12 голосов
/ 07 августа 2010

Я столкнулся с проблемой Objective-C, которая, кажется, не имеет никакого смысла для меня.Я относительно опытный программист ObjC и понимаю всю концепцию «предварительного декларирования», но от этого я почесал голову.Так вот в чем дело:

ClassA - это класс в моем проекте XCode, который предназначен только для проекта.ClassB является подклассом ClassA, который является общедоступным и импортируется в заголовок моей инфраструктуры.

При сборке я получаю сообщение об ошибке «Не удается найти интерфейс для ClassA», суперкласс «ClassB» ... ».Я уже поместил предварительное объявление @class ClassA; в ClassB.h, но это, похоже, не решает проблему.Когда я изменяю @class ClassA; на #import ClassA.h, он работает нормально.Однако, поскольку ClassA предназначен только для проектов, зависимые проекты не могут создавать ClassB, поскольку он не может получить доступ к источнику ClassA.

Любая помощь будет принята, и я надеюсь, что это имеет смысл.Спасибо!

Ответы [ 6 ]

37 голосов
/ 19 мая 2011

Проблема в том, что у вас есть бесконечный цикл в #imports.Решение: все #imports помещаются в файл реализации, а все необходимые классы объявляются в файлах .h.

10 голосов
/ 07 августа 2010

Чтобы создать подкласс класса, полное объявление суперкласса должно быть доступно компилятору.@class просто разрешает ссылки на экземпляры указанного класса - допускает A *foo;.

Для создания подклассов требуется больше метаданных (по крайней мере, это было в устаревшей среде выполнения - я думаю может быть возможно поддерживать подклассы без @interface полного супер. Технически возможно, но, вероятно, бесполезно.)

6 голосов
/ 03 февраля 2012

У меня есть ответ: Вы должны проверить свой заказ «#import». Перед использованием суперкласса он должен быть импортирован и скомпилирован.

1 голос
/ 01 марта 2012

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

1 голос
/ 15 декабря 2011

У меня была проблема, когда я использовал категории в методе суперкласса и получал эту ошибку наследования. Когда я переместил импорт категорий .h в файл суперкласса .m, ситуация начала улучшаться.

0 голосов
/ 17 января 2016

Как сказал @Igor, порядок импорта имеет значение:

Я должен был изменить

#import <KeychainItemWrapper/KeychainItemWrapper.h>
#import <Foundation/Foundation.h>

до

#import <Foundation/Foundation.h>
#import <KeychainItemWrapper/KeychainItemWrapper.h>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...