web-dev-qa-db-ja.com

「 'BlahDataController'に表示される@interfaceがないため、セレクタ 'aMethod:'が宣言されています。」

私の問題の簡単な例:

「BlahDataController.h内」

@interface BlahDataController : NSObject
-(NSString *)aMethod:(NSString *)theString;
@end

「BlahDataController.m内」

#import "BlahDataController.h"
@implementation BlahDataController

-(NSString *)aMethod:(NSString *)theString
{
    return @"Something";
}

@end

「BobViewController.h内」

@interface BobViewController : NSObject
-(void)aMethodOfSomeSort;
@end

「BobViewController.m内」

#import "BobViewController.h"
#import "BlahDataController.h"

@implementation BobViewController

-(void)aMethodOfSomeSort
{
    BlahDataController *blahDataController = [[BlahDataController alloc] init];
    NSLog(@"%@",[blahDataController aMethod:@"Variable"]);
}

@end

「NSLog(@ "%@"、[blahDataController aMethod:@ "Variable"]);」行エラーが表示されます:「 'BlahDataController'の@interfaceが表示されないため、セレクタ 'aMethod:'が宣言されています」

このエラーが発生している理由を誰でも知っていますか?

-=-=-=-=-=-=-=-=-=-=-

問題は、私の実際のプログラムでは、これと同じ実装があり、この方法で作成された何百ものメソッドでうまく動作するということです。ただし、頻繁に、新しく作成されたメソッドでこのエラーを受け取ります。私はそれを別に作らなかった。新しく作成された存在であることを認識しません。

-=-=-=-=-=-=-=-=-=-=-

これは私が現在それを回避している方法ですが、コンパイラがこの方法を受け入れる理由はわかりませんが、他の方法は受け入れません:

BobViewController.mを変更します。

#import "BobViewController.h"
#import "BlahDataController.h"
#import "AnotherDataController.h"

@implementation BobViewController

-(void)aMethodOfSomeSort
{
    BlahDataController *blahDataController = [[BlahDataController alloc] init];
    AnotherDataController *anotherDataController = [[AnotherDataController alloc] init];
    [anotherDataController fixedMethod:blahDataController theString:@"Variable"];
}

@end

「AnotherDataController.h内」

@interface AnotherDataController : NSObject
-(void)fixedMethod:(BlahDataController *)blahDataController theString:(NSString *)theString;
@end

「AnotherDataController.m内」

#import "AnotherDataController.h"
#import "BlahDataController.h"
@implementation AnotherDataController

-(void)fixedMethod:(BlahDataController *)blahDataController theString:(NSString *)theString
{
    NSLog(@"%@",[blahDataController aMethod:theString]);
}
@end

そして....それはうまく動作します...ですから、Xcodeはあるクラスのメソッドを認識できず、別のクラスで正常に動作していると思います...男、このエラーが発生する理由はわかりません。 。

-=-=-

マイナーアップデート:
「xcode dance」全体を実行しても問題は解決しませんでした
1)クリーンビルド
2)派生データの削除
3)XCodeを完全に閉じてから再度開きます

32
Highrule

tl; dr-プロジェクトのどこかに重複ファイルがあります!それを追い詰めて、容赦なく破壊してください!

わかりました、この問題の将来のすべてのために。これが問題でした。

数ヶ月前にBlahDataControllerを作成しました。約1週間前、プロジェクトのフォルダーを再構築し、BlahDataControllerを「Blah」というフォルダーから「Data」という別のフォルダーに移動しました。

「Data」フォルダー内のBlahDataControllerのコードを変更すると、クラスの1つが変更されたコードを見ることができましたが、別のクラスはできませんでした。

最終的に問題になったのは、私がBlahDataControllerを移動すると、実際にそのコピーが作成されたことです。そのため、「Data」フォルダーにBlahDataControllerがあり、「Blah」フォルダーに古いBlahDataControllerがありました。古いBlahDataControllerはプロジェクトマネージャー(xcodeの左側)でプロジェクトに添付されていませんでしたが、フォルダーに物理ファイルがまだ存在しているという事実が原因でこの問題が発生しました。

BlahDataControllerの古いコピーを削除した後、問題は解決しました。

57
Highrule

誰かが同様の問題に出くわした場合、私の場合、「検索と置換」機能を使用していくつかのリファクタリングを行い(大文字と小文字を無視)、次のようなものを得ました:

SomeClass* SomeClass = [[SomeClass alloc] init];
[SomeClass instanceMethod];

「 'SomeClass'の可視@interfaceはメソッド 'alloc'を宣言していません。したがって、私の場合、問題はインスタンス変数の名前を大文字に変更しました。解決策は:

SomeClass* someClass = [[SomeClass alloc] init];
[someClass instanceMethod];

PS:可能であれば、「検索と置換」の代わりにXcodeの「リファクタリング」機能を使用することをお勧めします。

4
Maxim Chetrusca

注:この正確な質問に対する答えではありませんが、同じコンパイラエラーを探してここに来ました。

インスタンスメソッドを呼び出すのか、静的メソッドを呼び出すのかを必ず確認してください。

@interface SomeClass

+(void) SomeMethod;

vs.

-(void) SomeMethod;

これらは異なります。

[SomeClass SomeMethod];

vs.

[[[SomeClass alloc] init] SomeMethod];
4
Nick

また、マスター/詳細プロジェクトテンプレートでこれが発生する可能性があることに注意してください

"Other Linker Flags"

値は

-ObjC

いくつかのフレームワークで要求されるように、例えばRestKit(RestKitsのgithubページでの問題: https://github.com/RestKit/RestKit/issues/115

2
Lennert

はい、私は同じ問題を抱えていました。無料ターゲットに変更したときにこのエラーが発生しましたが、有料ターゲットでこれは完璧に機能していました。

「GameOverScene」の目に見える@interfaceはセレクターmesageToDisplayOnLabelを宣言しません:

  • これを修正するために、メソッド呼び出しのスペルは、私が呼び出していたメソッドと異なっていました。

    -(void)messageToDisplayOnLabel //メソッド呼び出しDohの「メッセージ」にsがありません。
    {
    //メソッドコード
    }

  • 呼び出しているメソッドのスペルを確認してください。

1
uplearnedu.com