私のiOS5アプリには、NSObject
States
クラスがあり、それを初期化しようとしています:
states = [states init];
以下はinit
のStates
メソッドです。
- (id) init
{
if ((self = [super init]))
{
pickedGlasses = 0;
}
return self;
}
しかし、行states = [states init];
にエラーがあります
インスタンスメッセージの受信者タイプ「状態」は、前方宣言です。
どういう意味ですか?何が間違っていますか?
これは基本的に、状態の宣言を含む.hファイルをインポートする必要があることを意味します。
ただし、コードに誤りがあるlotがあります。
+alloc
'ingせずに-init'しています。うまくいかない[super init]
で-init
を呼び出していません。@class
を使用してクラスを宣言しましたが、クラスをインポートしたことはありません。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
相互に依存する2つのファイルがあるときに、この種のメッセージを受け取りました。ここで注意が必要なのは、ヘッダーファイルから互いにインポートしようとすると(クラスAがクラスBをインポートし、クラスBがクラスAをインポートする)、循環参照を取得することです。したがって、代わりにクラスの(クラスBの)ヘッダーファイルの1つに前方(@class A
)宣言を配置します。ただし、クラスBの実装内でクラスAのivarを使用しようとすると、このエラーが発生し、クラスBの.mファイルに#import "A.h"
を追加するだけで問題が修正されました。
私にとっては@class "Myclass.h"を使用していました
#import "Myclass.h"に変更したとき
それはうまくいきました。
あなたが使用しています
States states;
どこで使うべきか
States *states;
初期化メソッドは次のようになります
-(id)init {
if( (self = [super init]) ) {
pickedGlasses = 0;
}
return self;
}
最後に、Statesクラスのオブジェクトを作成するときは、このようにする必要があります。
State *states = [[States alloc] init];
これが最善の方法だと言っているのではありません。ただし、オブジェクトの初期化の非常に基本的な使用法を理解するのに役立つ場合があります。
このエラーをスローしているクラスのヘッダーファイルをインポートしたかどうかを確認してください。
ユニットメソッドのプロトタイプが.hファイルにあることを確認してください。
ファイルで定義しているよりも高いメソッドを呼び出しているため、このメッセージが表示されます。または、メソッドを再配置して、呼び出し元が呼び出すメソッドよりもファイル内で低くなるようにすることもできます。
関連するエラーメッセージが2つあり、宣言またはインポート、あるいはその両方に問題があることを通知する場合があります。
最初は、参照しているものです。これは、.h(または.pchファイル)に#importを入れずに、.hで@classを宣言することで生成できます。
Statesクラスに次のようなメソッドがあった場合、2番目に表示されます。
- (void)logout:(NSTimer *)timer
#importを追加した後は次のとおりです。
「States」の目に見える@interfaceがセレクタ「logout:」を宣言していない
これが表示された場合、インポートまたは転送するクラスの.hファイルで(この場合) "logout"メソッドを宣言したかどうかを確認する必要があります。
したがって、あなたの場合には、次のものが必要です。
- (void)logout:(NSTimer *)timer;
statesクラスの.hで、これらの関連するエラーの一方または両方を消します。