web-dev-qa-db-ja.com

インスタンスメッセージの受信者タイプ***は前方宣言です

私のiOS5アプリには、NSObjectStatesクラスがあり、それを初期化しようとしています:

states = [states init];

以下はinitStatesメソッドです。

- (id) init
{
    if ((self = [super init]))
    {
        pickedGlasses = 0;
    }

    return self;
}

しかし、行states = [states init];にエラーがあります

インスタンスメッセージの受信者タイプ「状態」は、前方宣言です。

どういう意味ですか?何が間違っていますか?

192
SentineL

これは基本的に、状態の宣言を含む.hファイルをインポートする必要があることを意味します。

ただし、コードに誤りがあるlotがあります。

  • オブジェクトを+alloc 'ingせずに-init'しています。うまくいかない
  • オブジェクトを非ポインター型として宣言していますが、どちらも機能しません
  • [super init]-initを呼び出していません。
  • ヘッダーで@classを使用してクラスを宣言しましたが、クラスをインポートしたことはありません。
428
Catfish_Man

FWIW、既存のプロジェクトにコアデータを実装しているときにこのエラーが発生しました。 CoreData.hをプロジェクトにリンクするのを忘れていました。 CoreDataフレームワークを既にプロジェクトに追加していましたが、Appleのテンプレートと同じように、プリコンパイル済みヘッダーのフレームワークにリンクすることで問題を解決しました。

#import <Availability.h>

#ifndef __IPHONE_5_0
#warning "This project uses features only available in iOS SDK 5.0 and later."
#endif

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import <CoreData/CoreData.h>
#endif
27
capikaw

相互に依存する2つのファイルがあるときに、この種のメッセージを受け取りました。ここで注意が必要なのは、ヘッダーファイルから互いにインポートしようとすると(クラスAがクラスBをインポートし、クラスBがクラスAをインポートする)、循環参照を取得することです。したがって、代わりにクラスの(クラスBの)ヘッダーファイルの1つに前方(@class A)宣言を配置します。ただし、クラスBの実装内でクラスAのivarを使用しようとすると、このエラーが発生し、クラスBの.mファイルに#import "A.h"を追加するだけで問題が修正されました。

23
Stunner

私にとっては@class "Myclass.h"を使用していました

#import "Myclass.h"に変更したとき

それはうまくいきました。

15
Suraj K Thomas

あなたが使用しています

States states;

どこで使うべきか

States *states;

初期化メソッドは次のようになります

-(id)init {
  if( (self = [super init]) ) {
      pickedGlasses = 0;
  }
  return self;
}

最後に、Statesクラスのオブジェクトを作成するときは、このようにする必要があります。

State *states = [[States alloc] init];

これが最善の方法だと言っているのではありません。ただし、オブジェクトの初期化の非常に基本的な使用法を理解するのに役立つ場合があります。

6
Arslan

このエラーをスローしているクラスのヘッダーファイルをインポートしたかどうかを確認してください。

3
nemesis

ユニットメソッドのプロトタイプが.hファイルにあることを確認してください。

ファイルで定義しているよりも高いメソッドを呼び出しているため、このメッセージが表示されます。または、メソッドを再配置して、呼び出し元が呼び出すメソッドよりもファイル内で低くなるようにすることもできます。

1
Fletch

関連するエラーメッセージが2つあり、宣言またはインポート、あるいはその両方に問題があることを通知する場合があります。

最初は、参照しているものです。これは、.h(または.pchファイル)に#importを入れずに、.hで@classを宣言することで生成できます。

Statesクラスに次のようなメソッドがあった場合、2番目に表示されます。

- (void)logout:(NSTimer *)timer

#importを追加した後は次のとおりです。

「States」の目に見える@interfaceがセレクタ「logout:」を宣言していない

これが表示された場合、インポートまたは転送するクラスの.hファイルで(この場合) "logout"メソッドを宣言したかどうかを確認する必要があります。

したがって、あなたの場合には、次のものが必要です。

- (void)logout:(NSTimer *)timer;

statesクラスの.hで、これらの関連するエラーの一方または両方を消します。

0
whyoz