Objective-Cの「インスタンスに認識されないセレクターが送信されました」エラー


155

ボタンを作成してアクションを追加しましたが、ボタンが呼び出されるとすぐに次のエラーが発生しました。

-[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance
 0x3d03ac0 2010-03-16 22:23:58.811
 Money[8056:207] *** Terminating app
 due to uncaught exception
 'NSInvalidArgumentException', reason:'*** -[NSCFDictionary numberButtonClick:]:  unrecognized selector sent to instance 0x3d03ac0'

これは私のコードです:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        UIButton *numberButton = [UIButton buttonWithType:UIButtonTypeCustom];        
        numberButton.frame = CGRectMake(10, 435, 46, 38);
        [numberButton setImage:[UIImage imageNamed:@"one.png"] forState:UIControlStateNormal];
        [numberButton addTarget:self action:@selector(numberButtonClick:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview: numberButton]; 
    }
return self;
}

-(IBAction)numberButtonClick:(id)sender{
    NSLog(@"---");
}

回答:


187

あなたはビューコントローラを適切に管理しているメモリではなく、ある時点で割り当てが解除されているようです-これによりnumberButtonClicked:、ビューコントローラが以前に占有していたメモリを占有している別のオブジェクトにメソッドが送信されます...

ビューコントローラを適切に保持/解放していることを確認してください。


105
これは、ほんの数行のコードからの非常に鋭い診断です。
マイケルモリソン、

41
OK、問題は特定されましたが、「ビューコントローラを適切に保持または解放していることを確認してください。」提案ではなく、解決策です。
アレックスグレイ

12
@alexグレイ、なに?ビューコントローラの適切なメモリ管理で問題が解決しました...それが解決策ではない方法がわかりませんか?
Jasarien

28
正しい。これは「修正」のようですが、私は少数派かもしれませんが(まだ存在することはできますが)、問題と解決策の関係はすぐにはわかりません。たとえば、私は遭遇して-[NSWindow end]: unrecognized selector sent to instance 0x100523e80 おり、OPとの類似点、そしておそらくあなたの答えから問題の原因さえも理解していますが、修正の実装はすぐにはわかりません
Alex Grey

12
それはすぐにわかります。NSWindowのメモリ管理は、どこかで正しくありません。それのライフサイクルを通過し、それを修正します。
Jasarien、2011年

127

私と同じようにGoogle経由でアクセスする人にとっては、ARCの場合は、Xcode 4.2以降/ iOS 5以降に関係している可能性があります。同じエラー「インスタンスに認識されないセレクターが送信されました」が発生しました。私の場合、自分自身を送信者パラメーターとして渡すようにUIButtonのターゲットアクションを設定しましたが、後でそれが不要であることを認識し、コードから削除しました。だから、次のようなもの:

- (IBAction)buttonPressed:(UIButton *)sender {

に変更されました:

- (IBAction)buttonPressed {

問題のUIButtonを右クリックすると、Touch Up InsideイベントがビューコントローラーのbuttonPressed:メソッドに関連付けられていることがわかりました。これを削除して、変更されたメソッドに再度割り当てると、問題なく動作しました。


これは非常に役に立ちましたが、私自身の質問と回答によって見つけやすくなったと思います。
Curtis Inderwiesche 2012年

@LeonardChallisパラメータとして渡されない場合、buttonPressedで送信者をどのように参照できますか?
ザクダンス

8
非常に役立つ応答。私はこの正確な問題に遭遇し、あなたの解決策は正確でした。これが起こったとき、iTunesUのStanford iOSクラスをフォローしていました。お返事ありがとうございます!
Marshall Alsup、2012

1
@LeonardChallisありがとう。私はあなたの答えに無料の答えを加えました。
1.21ギガワット2013年

1
私は同様の問題に苦労していて、selector関数からsenderパラメーターを削除してから、送信者を取得する方法を知りました。私の場合、セレクターコールバックの後にコロンを付け忘れたためにエラーが発生し、呼び出しシーケンスの不一致が発生しました。コロンがあれば、送信者の引数を保持できます。

74

これがこの問題に対するGoogleの回答のトップでしたが、私には別の原因/結果がありました。他の人がこの問題に遭遇した場合に備えて、2セント追加すると思いました。

今朝も同様の問題がありました。問題が発生しているUIアイテムを右クリックすると、作成された接続を確認できることがわかりました。私の場合、ボタンを2つのアクションに配線しました。右クリックメニューからアクションを削除して再配線し、問題を修正しました。

したがって、アクションが正しく関連付けられていることを確認してください。


これが私の問題でした。関数の名前を変更してコードを変更しましたが、xibファイルの接続は変更しませんでした。
BFTrick 2012

2
ありがとうございました!削除した3つのメソッドがまだ参照されていることがわかりました。1週間私を悩ませています!
erdekhayser 2013年

25

はい、ここにチップを入れなければなりません。OPは動的にボタンを作成しました。私も同様の問題を抱えていましたが、(数時間の狩猟後の)答えは非常に単純なので、私はうんざりしました。

使用する場合:

action:@selector(xxxButtonClick:)

or (as in my case)

action:NSSelectorFromString([[NSString alloc] initWithFormat:@"%@BtnTui:", name.lowercaseString])

文字列の最後にコロンを付けると、送信者を通過します。コロンを文字列の最後に配置しないと、コロンは配置されません。また、コロンが予期されている場合、レシーバーはエラーを受け取ります。イベント名を動的に作成している場合、コロンが欠落しがちです。

レシーバーコードオプションは次のようになります。

- (void)doneBtnTui:(id)sender {
  NSLog(@"Done Button - with sender");
}
 or
- (void)doneBtnTui {
  NSLog(@"Done Button - no sender");
}

いつものように、見逃されているのは常に明白な答えです。


1
どうもありがとうございました!これは私の問題でした(セレクターの名前の最後にコロン「:」を付けないこと)。なぜほとんどの場合、オタクが午前3時に壁に頭をぶつけてしまう最も愚かな単純なことなのでしょうか。本当にありがとうございました!
TWright、2013

23

私の場合、関数は引数を期待していませんでしたが、ボタンはエラーを引き起こす引数を送信するように構成されていました。これを修正するには、イベントハンドラーを再配線する必要がありました。

これが私の機能です:

ここに画像の説明を入力してください

引数が含まれていないことに注意してください。

これは私のボタン構成の画像です(ボタンを右クリックして表示します)。

ここに画像の説明を入力してください

3つのイベントハンドラーがあることに注意してください。

これを修正するには、イベントアイテムの1つをそれ自体への参照をenterPressed関数に送信していたため、各イベントアイテムを削除する必要がありました。これらのアイテムを削除するには、アイテムが表示されなくなるまで、各アイテムの名前の横にある小さなxアイコンをクリックしました。

ここに画像の説明を入力してください

次に、ボタンをイベントに再接続する必要がありました。これを行うには、Ctrlキーを押しながら、ボタンからアクションに線をドラッグします。「接続アクション」と表示されているはずです。注:何らかの理由でこれを機能させるには、XCodeを再起動する必要がありました。それ以外の場合は、関数の上または下にアクション(別名、新しいアクションを作成)のみを挿入できます。

ここに画像の説明を入力してください

これで、引数を渡さないボタンイベントにワイヤリングされた単一のイベントハンドラーができました。

ここに画像の説明を入力してください

この回答は、@ Leonard Challisの回答も補完するものです。


14

これは、インターフェイスビルダーでビューの「クラス」を設定しない場合にも発生する可能性があります。


ありがとうございます!これにより、セグエでアプリがクラッシュしました。コントローラーのクラスを設定するのを忘れていました。
Eichhörnchen

なぜクラスを知る必要があるのですか?UITableViewSectionをUIViewとして使用しようとしているため、このエラーが発生します。コンパイラーはUITableViewSectionが存在しないと言っているので、UIKitの内部にあると思います。
Ian Warburton 2016

13

私の場合、NSNotificationCenterを使用していて、引数を取らないセレクターを使用しようとしましたが、コロンを追加していました。コロンを削除すると問題が解決しました。

セレクター名を使用する場合、引数がない場合は末尾のコロンを使用しないでください。引数が1つの場合は、末尾のコロンを1つ使用します。引数が複数ある場合は、各引数の末尾にコロンを付けて名前を付ける必要があります。

こちらのAdam Rosenfieldの回答をご覧ください:Objective-Cのセレクター?


11

ボタンを動的に作成するSwiftプロジェクトでこの問題が発生しました。問題コード:

var trashBarButtonItem: UIBarButtonItem {
    return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked")
}

func newButtonClicked(barButtonItem: UIBarButtonItem) {
    NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
}

解決策は、アクションの後に完全なコロン「:」を追加することでした:例

var trashBarButtonItem: UIBarButtonItem {
        return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked:")
    }

    func newButtonClicked(barButtonItem: UIBarButtonItem) {
        NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
    }

ここに完全な例:https : //developer.apple.com/library/content/samplecode/UICatalog/Listings/Swift_UIKitCatalog_DefaultToolbarViewController_swift.html


チュートリアルを読み、このまったく同じ問題に関するヒントを読んだ直後-私はそれを
思いつき

6

これの最も明白な原因(完全を期すために含まれています)は、ポインターを不適切にキャストし、間違ったクラスのメソッドを呼び出すことです。

NSArray* array = [[NSArray alloc] init];
[(NSDictionary*)array objectForKey: key]; // array is not a dictionary, hence exception

これは良いヒントです-ビューまたはデータオブジェクトをサブクラス化しない(たとえば、サブクラス名の追加に失敗した)ことは、これが起こるもう1つの方法です
Brad M

4

私も同じ問題を抱えていました。

ストーリーボードのuibuttonを削除して再作成しましたが、すべて正常に機能します。


3

同様の問題がありましたが、解決策は少し異なりました。私の場合、Categoryを使用して既存のクラス(一部のサイズ変更機能についてはUIImage-興味がある場合はこのHowtoを参照してください)を拡張し、*。mファイルをビルドターゲットに追加するのを忘れていました。愚かなエラーですが、どこを見れば発生するかは必ずしも明らかではありません。共有する価値があると思いました...


3

これは、UIViewcontrollerクラスコード内の「@IBAction func ...」を誤って消去したために起こりました。ストーリーボードに参照アウトレットが作成されましたが、実行時にそれを処理する関数がありました。

解決策は、プロパティインスペクター内のOutlet参照を削除し、コマンドキーを使用してクラスコードにドラッグしてOutlet参照を再作成することでした。

それが役に立てば幸い!


同様に、ボタンがもう存在しない機能を参照しているときにも、これが起こりました。
Josh Wolff

2

戻り値の型では、IBActionの代わりにvoidを使用する必要があると思います。プログラムでボタンを定義したからです。


2

別の可能な解決策: '-ObjC'をリンカー引数に追加します。

完全な説明はこちら:静的ライブラリのObjective-Cカテゴリ

要点は次のとおりです。カテゴリが静的にリンクしているライブラリで定義されている場合、リンカはカテゴリメソッドでリンクするほどスマートではありません。上記のフラグは、ソースの分析に基づいてリンカーがリンクする必要があると考えるものだけでなく、すべての目的のCクラスおよびカテゴリーにリンカーリンクを作成します。(その答えを自由に調整または修正してください。リンクされた言語を知っているので、ここでオウムを振るだけです)。


2

同じエラーが発生し、次のことがわかりました。

コードを使用するとき

[self.refreshControl addTarget:self action:@selector(yourRefreshMethod:) forControlEvents:UIControlEventValueChanged];

あなたはそれがセレクターを探していると思うかもしれません:

- (void)yourRefreshMethod{
    (your code here)
}

しかし、実際にはセレクターを探しています。

- (void)yourRefreshMethod:(id)sender{
    (your code here)
}

そのセレクターは存在しないため、クラッシュします。

エラーを解決するために、セレクターを受信(id)送信者に変更できます。

しかし、センダー提供せずにリフレッシュ関数を呼び出す他の関数がある場合はどうでしょうか?両方で機能する1つの関数が必要です。簡単な解決策は、別の機能を追加することです:

- (void)yourRefreshMethodWithSender:(id)sender{
    [self yourRefreshMethod];
}

次に、代わりにそのセレクターを呼び出すように更新プルダウンコードを変更します。

[self.refreshControl addTarget:self action:@selector(yourRefreshMethodWithSender:) forControlEvents:UIControlEventValueChanged];

また、Mac OSXの最新バージョンにアップグレードできない古いMacでスタンフォードiOSコースを行っています。だから私はまだiOS 6.1向けにビルドしており、これで問題が解決した。


2

私の場合、私は2時間後に問題を解決しました:

送信者(tabBarアイテム)には参照アウトレットがありませんでした。だからそれはどこも指していない。

Justeは、関数に対応する参照アウトレットを作成します。

これが皆さんのお役に立てば幸いです。


付け加えると、私の場合、私はIBActionSwift への移植を忘れていました。そのため、その関数を呼び出したいとの不満がありましたが、見つかりませんでした。
DevNebulae

1

私は現在iOS開発を学び、aPressの「Beginning iOS6 Development」の本を読んでいます。第10章:ストーリーボードでも同じエラーが発生しました。

それを理解するのに2日かかりましたが、TableViewセルのタグを誤って1に設定してはいけないことがわかりました。この本をやっていて、同様のエラーを受け取った他の人にとって、これが役に立てば幸いです。

私のコードの将来のエラーが見つけやすくなることを本当に望んでいます!ははは。デバッグエラーは、それを理解するために正しい方向に私を押し進めるために何もしませんでした(または少なくとも私はデバッガーを理解するには余りにも新しいです、笑)。


1

私の場合、UIWebViewを使用していて、NSURLの代わりに2番目のパラメーターでNSStringを渡しました。したがって、関数に渡された間違ったクラス型がこのエラーを引き起こす可能性があると思います。


1

..そして今私のもの

別のボタンのパラメーターにアクセスするメソッドにボタンをリンクさせましたが、それはうまくいきましたが、ボタン自体で何かをしようとするとすぐにクラッシュしました。コンパイル中、エラーは表示されません。

ボタンをファイルの所有者にリンクできませんでした。だからここに誰かが私と同じくらい愚かであるなら、これを試してください:)


1

さらに別のわずかに異なるソリューション/ケース。

XamarinとMvvmCrossを使用していて、UIButtonをViewModelにバインドしようとしていました。UIButtonをOutletとTouchUpInsideに配線しました。

バインドするとき、私はコンセントのみを使用します:

set.Bind (somethingOutlet).For ("TouchUpInside").To(vm => vm.Something);

XCodeのアクション(TouchUpInside)接続を削除するだけで解決しました。

PSこれは、以前の回答、特に@Chris Kaminskiにすべて関連していると思いますが、これが誰かに役立つことを願っています...

乾杯。


1

同じ問題がありました。私にとっての問題は、1つのボタンに2つのアクションメソッドがあったことです。ボタンの最初のアクションメソッドを作成し、それをビューコントローラーで削除しましたが、接続インスペクターのメインストーリーボードで接続を切断するのを忘れていました。そのため、2つ目のアクションメソッドを追加すると、1つのボタンに2つのアクションメソッドがあり、エラーが発生しました。


1

私にとって、それはinterfacebuilder bij ctrl-draggingで作成された残りの接続でした。切断された接続の名前はエラーログにありました

*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[NameOfYourApp.NameOfYourClass nameOfCorruptConnection:]:
unrecognized selector sent to instance 0x7f97a48bb000'

ボタンにリンクされたアクションがありました。アウトレットがコードに存在しなくなったため、ボタンを押すとアプリがクラッシュしました。ログで名前を検索すると、ストーリーボードにその名前が表示されました。それを削除すると、クラッシュはなくなりました!


0

Leonard Challisに返信しています。これは、ユーザー "oli206"と同様に、Stanford iOSクラスC193Pも受けていたためです。

「キャッチされなかった例外「NSInvalidArgumentException」が原因でアプリを終了しています。理由:」

問題は、電卓の[Enter]ボタンを2回接続したことでした。友人が、ストーリーボードのボタンを調べたところ、右クリックしたときに[Touch Up Inside]属性に2つのエントリがあることがわかったと指摘しました。 「Enter」ボタン。2つの「タッチアップインサイド」「送信済みイベント」のいずれかを消去すると、問題は解決しました。

これは、2つの送信イベントとして問題がトリガーされることを示しています(割り当て1の電卓ウォークスルーのC193Pビデオクラスの場合)。その1つが例外の原因でした。


なんと3つのエントリーがありました。:)
1.21ギガワット2013年

0

これは、InterfaceBuilderでViewControllerをViewControllerSceneに割り当てない場合に発生する可能性があります。したがって、ViewController.mはどのシーンにも接続されていません。


0

私の共有を含みます。ARC(自動カウント参照)を無効にしてプロジェクトを作成したことに気付くまで、しばらくの間私はこれに行き詰まりました。そのオプションをすばやくYESに設定すると、問題が解決しました。


0

この別の本当にばかげた原因は、selectorがinterface(.h)で定義されているが、implementation(.m)では定義されていないことです(pe typo)


0

リストに追加する別の理由/解決策。これはiOS6.0(および/または不適切なプログラミング)が原因です。古いバージョンでは、パラメーターのタイプが一致した場合にセレクターは一致しましたが、iOS 6.0では、以前に機能していたコードでパラメーターの名前が正しくない場合にクラッシュしました。

私は何かをしていた

[objectName methodName:@"somestring" lat:latValue lng:lngValue];

しかし、定義(.hと.mの両方)では、

(viod) methodName:(NSString *) latitude:(double)latitude longitude:(double)longitude;

これはiOS5では正常に機能しましたが、異なるデバイスにデプロイされたまったく同じビルドであっても、6では機能しませんでした。

とにかく、コンパイラがこれを教えてくれなかった理由がわかりません-問題が解決されました。


0

これは、ControllerAからカスタムControllerBクラス内のパブリックプロパティにプロパティを設定する必要があり、ストーリーボードのIDインスペクター内に「カスタムクラス」をまだ設定していない場合にも発生する可能性があります。


0

私の問題と解決策は異なっていたので、将来の読者が頭を壁にぶつけないようにできるように、ここに投稿する必要があると考えました。

異なるxibを同じUIVIewControllerに割り当てていましたが、どこを検索しても修正方法を見つけることができませんでした。次に、呼び出しているAppDelegateを確認しましたがinitWithNibName、コードをコピーしているときにxib名を変更しましたが、UIViewControllerクラスを変更するのを忘れていました。したがって、どの解決策もうまくいかない場合は、initWithNibNameメソッドを確認してください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.