"Не удается найти ошибку описания интерфейса..." после @class
Я столкнулся с проблемой Objective-C, которая, похоже, не имеет для меня никакого смысла. Я относительно хорошо разбираюсь в программиста ObjC и понимаю всю концепцию "прямой декларации", но у меня есть я, царапая голову. Итак, сделка:
ClassA - это класс в моем проекте Xcode, который является только проектом.
ClassB является подклассом ClassA, который является общедоступным и импортируется в заголовок фрейма.
Я получаю сообщение "Не удается найти интерфейс для класса ClassA, суперкласс класса" ClassB "..." при создании. Я уже положил объявление @class ClassA;
forward в ClassB.h, но это, похоже, не решает проблему. Когда я изменяю @class ClassA;
на #import ClassA.h
, он отлично работает. Однако, поскольку ClassA только для проекта, зависимые проекты не могут создавать ClassB, потому что он не может получить доступ к источнику ClassA.
Любая помощь будет оценена, и я надеюсь, что это имеет смысл. Спасибо!
Ответы
Ответ 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>