33

私の問題の簡単な例:

「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 ダンス」全体を実行しても問題は解決しませんでした
1) クリーン ビルド
2) 派生データを削除
3) XCode を完全に閉じて再度開く

4

5 に答える 5

58

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

わかりました。この問題を抱える将来のすべての人のために。これが問題でした。

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

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

結局問題になったのは、BlahDataControllerを移動したときに、実際にそのコピーが作成されたということでした。そのため、「Data」フォルダーにBlahDataControllerがあり、「Blah」フォルダーに古いBlahDataControllerがありました。古いBlahDataControllerがプロジェクトマネージャー(xcodeの左側)のプロジェクトにアタッチされていなくても、物理ファイルがフォルダーにまだ存在しているという事実がこの問題の原因でした。

BlahDataControllerの重複する古いコピーを削除した後、問題は解決されました。

于 2012-05-24T19:45:00.263 に答える
4

誰かが同様の問題に遭遇した場合、私の場合、「検索と置換」機能を使用してリファクタリングを行い(大文字と小文字を区別しない)、次のような結果が得られました。

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

そしてそれは言っていました:「「SomeClass」の目に見える@interfaceはメソッド「alloc」を宣言していません。したがって、私の場合、問題はインスタンス変数の名前を大文字に変更したことでした。解決策は次のとおりです。

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

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

于 2014-07-02T13:47:10.720 に答える
2

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

"Other Linker Flags"

値はに設定されています

-ObjC

一部のフレームワークで必要な場合 (RestKit など) (RestKits github ページでの問題: https://github.com/RestKit/RestKit/issues/1153 )

于 2013-01-14T12:49:16.393 に答える
1

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

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

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

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

  • 呼び出しているメソッドのスペルを確認すると役立つ場合があります。

于 2014-11-16T00:07:35.800 に答える