Grimless
Grimless

Reputation: 1266

"Cannot find interface declaration error..." after @class

I've run into an Objective-C problem that doesn't seem to make any sense to me. I am a relatively well-versed ObjC programmer and understand the whole "forward declaration" concept, but this one has me scratching my head. So here's the deal:

ClassA is a class in my Xcode project that is project-only. ClassB is a subclass of ClassA which is public and is imported into my framework's header.

I am getting a "Cannot find interface declaration for 'ClassA', superclass of 'ClassB'..." error when building. I have already put the @class ClassA; forward declaration in ClassB.h, but that does not seem to solve the problem. When I change the @class ClassA; to #import ClassA.h, it works fine. However, since ClassA is project-only, dependent projects cannot build ClassB because it cannot access ClassA's source.

Any help would be appreciated and I hope that makes sense. Thanks!

Upvotes: 12

Views: 27282

Answers (6)

mllm
mllm

Reputation: 17458

Like @Igor said, the order of imports matters:

I had to change

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

to

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

Upvotes: 0

Rubycon
Rubycon

Reputation: 18346

I have an answer: You must check your '#import' order. Before you use the superclass it should be imported and compiled.

Upvotes: 7

DragonSL
DragonSL

Reputation: 11

Just carry out all possible headers from .h to .m file of superclass and see which one is the matter of the problem. I'm sure that it's one of common headers used in both classes.

Upvotes: 1

cipherz
cipherz

Reputation: 543

I had an issue where I was using categories in a superclass method and was getting this inheritance error. Once I moved the categories .h imports to the superclass .m file thing started getting better.

Upvotes: 1

Vitaliy A
Vitaliy A

Reputation: 3838

The problem is that you have an infinite loop in your #imports. The solution: all #imports go in the implementation file and all classes needed are declared in the .h files.

Upvotes: 37

bbum
bbum

Reputation: 162722

To subclass a class, the superclass's full declaration must be available to the compiler. @class just enables references to instances of said class -- allows for A *foo;.

Subclassing requires more metadata (at least, it did under the legacy runtime -- I think it might be possible to support subclassing without the full super's @interface. Technically possible, but probably not useful.)

Upvotes: 10

Related Questions