Подтвердить что ты не робот

"Не удается найти ошибку описания интерфейса..." после @class

Я столкнулся с проблемой Objective-C, которая, похоже, не имеет для меня никакого смысла. Я относительно хорошо разбираюсь в программиста ObjC и понимаю всю концепцию "прямой декларации", но у меня есть я, царапая голову. Итак, сделка:

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Мне пришлось изменить

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

к

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