Objective-C 中的“发送到实例的无法识别的选择器”错误

我创建了一个按钮并为其添加了一个操作,但是一旦它被调用,我就得到了这个错误:

-[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(@"---");
}
462890 次浏览

看起来你没有正确地管理视图控制器的内存,而且它在某个时候被释放了——这导致 numberButtonClicked:方法被发送到另一个对象,这个对象现在正在占用视图控制器之前占用的内存..。

确保正确地保留/释放视图控制器。

对于那些像我一样通过谷歌来到这里的人来说,这可能更适合 Xcode 4.2 +/iOS 5 + 等等,比如 ARC。我犯了同样的错误“ 发送到实例的无法识别的选择器”。在我的例子中,我设置了一个 UIButton 的 target 操作作为 sender 参数传递给自己,但后来意识到我不需要它,并在代码中删除了它。比如:

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

改为:

- (IBAction)buttonPressed {

右键单击有问题的 UIButton 显示 Touch Up Inside 事件与视图控制器 buttonPress: 方法相关联。移除这个并将其重新分配到修改后的方法中起到了治疗作用。

这是谷歌对这个问题的最佳答案,但我有一个不同的原因/结果-我想我应该加入我的两分,以防其他人碰巧发现这个问题。

今天早上我也遇到过类似的问题。我发现,如果右键单击给出问题的 UI 项,就可以看到创建了哪些连接。在我的情况下,我有一个按钮连接到两个动作。我从右键菜单中删除了这些操作,并重新连接了它们,我的问题就解决了。

所以确保你们的行动是正确的。

我认为您应该使用 void,而不是返回类型中的 IBAction。因为您以编程方式定义了一个按钮。

在我的例子中,我使用的是 NSNotificationCenter,并试图使用一个不带参数但添加冒号的选择器。移除冒号解决了这个问题。

使用选择器名称时,如果没有参数,不要使用尾随冒号。如果有一个参数,使用一个结尾冒号。如果有多个参数,则必须将它们命名为每个参数的尾部冒号。

点击这里查看 Adam Rosenfield 的回答: 目标 C 中的选择器? ?

如果你没有将视图的“类”设置为 Interface Builder,这种情况也会发生。

我回复 Leonard Challis,因为我也在学习斯坦福 iOS 类 C193P,还有用户“ oli206”

“由于未捕获异常‘ NSInvalidArgumentException’而终止应用程序,原因:”

问题是我把计算器上的“ Enter”按钮连接了两次,一个朋友指出,在故事板上检查按钮时发现,当我右键点击“ Enter”按钮时,“ Touch Up Inside”属性上有2个条目。删除其中一个“触摸内部”“发送事件”解决了这个问题。

这表明问题是由2个发送事件触发的(对于任务1上的计算器演练中的 C193P 视频类) ,其中一个引起了异常。

我也遇到过类似的问题,但对我来说,解决方案略有不同。在我的例子中,我使用了一个 Category 来扩展一个现有的类(UIImage 提供了一些调整大小的功能——如果您感兴趣,请参阅这个 怎么做) ,但是忘记添加 * 。M 文件到生成目标。愚蠢的错误,但不总是显而易见的时候,它发生在哪里看。我觉得值得分享。

中未将 ViewController 分配给 ViewControllerScene 时,可能会发生这种情况 所以 ViewController.m 没有连接到任何场景。

包括我那份。我被这个问题困住了一段时间,直到我意识到我已经创建了一个禁用 自动计数参考的项目。一个快速设置为 YES 的选项解决了我的问题。

另一个非常愚蠢的原因是在接口中定义了选择器(。H) ,但在实施(。M)(错别字)

添加到列表中的另一个原因/解决方案。这是由 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上就不行了,即使是部署到不同设备上的完全相同的版本。

我不明白为什么编译器不能告诉我这个,反正问题解决了。

当您想要在定制 ControllerB 类中将属性从 ControllerA 设置为公共属性,而您还没有在故事板中设置身份检查器中的“ Custom Class”时,也可能会发生这种情况。

另一种可能的解决方案是: 在链接器参数中添加“-OBC”。

详细解释在这里: Objective-C 类在静态库中的应用

我认为要点是: 如果类别是在你静态链接的库中定义的,链接器不够聪明,不能在类别方法中链接。上面的标志使链接器链接在所有的目标 C 类和类别,而不仅仅是它的 认为它需要基于分析你的源。(请随意调整或更正这个答案。我知道连接语言,所以我在这里只是鹦鹉学舌)。

在我的例子中,函数没有期待一个参数,但是按钮被配置为发送一个导致错误的参数。为了解决这个问题,我必须重新连接事件处理程序。

我的功能是:

enter image description here

注意它没有参数。

下面是我的按钮配置图(右击按钮查看) :

enter image description here

注意,有3个事件处理程序。

为了解决这个问题,我必须删除每个事件项,因为其中一个事件项正在向 enterPress 函数发送一个对其本身的引用。为了删除这些项目,我点击了每个项目名称旁边的小 x 图标,直到没有项目显示为止。

enter image description here

接下来,我必须将按钮重新连接到事件。要做到这一点,按住 Control 键,然后从按钮拖动一行到操作。应该写“连接行动”。注意: 由于某种原因,我必须重新启动 XCode 才能正常工作; 否则它只允许我在函数的上方或下方插入操作(即创建一个新操作)。

enter image description here

您现在应该有一个连接到不传递任何参数的按钮事件的单个事件处理程序:

enter image description here

这个答案赞美了“ Leonard Challis”的答案,你也应该读一读。

最明显的原因(为了完整性而包括在内)是不正确地转换指针和调用错误类的方法。

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

我目前正在学习 iOS 开发,并且正在阅读由 aPress 出版的“开始 iOS6开发”一书。我在第10章: 情节串连图板中也遇到了同样的错误。

我花了两天时间才弄明白,但发现我不小心将 TableView 单元格的标签设置为1,而我本不该这么做。对于任何其他人做这本书,并收到类似的错误,我希望这有所帮助。

我真的希望以后在我的代码中更容易发现错误!哈哈哈。调试错误并没有把我推向正确的方向去弄明白它(或者至少我太新了以至于不能理解调试器,lol)。

在我的例子中,我使用了 UIWebView,并且在第二个参数中传递了 NSString,而不是 NSURL。因此,我怀疑传递给函数的错误类型可能会导致此错误。

好吧,我得凑点钱。动态创建按钮作战计划。我也遇到过类似的问题,答案(在几个小时的狩猎之后)是如此简单,以至于让我感到恶心。

使用时:

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");
}

和往常一样,答案总是显而易见的,却被忽略了。

我的问题和解决方案是不同的,我认为我应该把它贴在这里,以便未来的读者可以节省他们的头撞墙。

我将不同的 xib 分配给同一个 UIVIewController,即使在搜索了所有地方之后,我也找不到如何纠正它。然后,我检查了我正在调用 initWithNibName的 AppDelegate,可以看到在复制代码时,我更改了 xib 的名称,但是忘记了更改 UIViewController类。因此,如果没有一个解决方案适合您,请检查您的 initWithNibName方法。

发生在我身上是因为相互冲突的约束论点。

我也犯了同样的错误,发现了以下情况:

当你使用密码时

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

你可能认为它在寻找选择器:

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

但它实际上在寻找选择器:

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

那个选择器不存在,所以你会崩溃。

您可以将选择器更改为接收(id)发送方以解决错误。

但是,如果有其他函数调用刷新函数 没有来提供发送方,该怎么办呢?您需要一个同时适用于两者的函数。简单的解决方案是添加另一个函数:

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

然后修改刷新下拉代码来调用该选择器:

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

我还在一台无法升级到 Mac OSX 最新版本的旧 Mac 上学习斯坦福大学的 iOS 课程。所以我还在为 iOS6.1搭建系统,这解决了我的问题。

现在轮到我了

我把这个按钮链接到一个方法,这个方法访问了另一个按钮的参数,效果很好,但是当我试着用这个按钮做一些事情的时候,我就崩溃了。在编译过程中,没有显示任何错误。.解决办法?

我没能将按钮链接到文件的所有者。所以如果这里有人像我一样愚蠢,试试这个:)

基础: 动态调用

目标 C 是一种动态语言,它通过在运行时查找类中的方法来调用方法。例如,如果有包含方法 做某事(arg1,arg2)A 级。如果您尝试在 A 级对象上使用正确的参数调用该方法,那么一切都会正常工作。但是,如果参数没有正确传递,例如,只有当您使用一个参数调用该方法时,运行时才会将其视为对另一个方法的方法调用。最终,运行时将无法找到方法 (用一个论点做某事),并将通过此异常 “发送到实例的无法识别的选择器”

解决方案

请检查什么 签名@ selector是预期的。通常是,正如您在代码中所描述的

-(IBAction)numberButtonClick:(id)sender{

我在一个 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

又是一个略有不同的解决方案/案例。

我正在使用 Xamarin 和 MvvmCross,并尝试将 UIButton 绑定到 ViewModel。我把 UIButton 连接到插座和 TouchUpInside。

绑定时,我只使用插座:

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

我所要做的就是删除 XCode 中的动作(TouchUpInside)连接,这就解决了问题。

附言。 我想这是在它的基础上,所有有关以前的答案,特别是对@克里斯卡明斯基,但我希望这有助于某人..。

干杯。

我也有同样的问题。对我来说,问题是一个按钮有两个 Action 方法。我所做的是为我的按钮创建了第一个操作方法,然后在视图控制器中删除它,但是忘记在连接检查器中断开主故事板中的连接。因此,当我添加第二个操作方法时,现在一个按钮有两个操作方法,这导致了错误。

我也得到了这个问题,最后我找到了我的问题的解决方案。我在故事板中构建了 controller's UI,但是 controller's UI没有把它的控制与代码联系起来,我使用这个代码来初始化 vc:

    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Me" bundle:nil];
[sb instantiateViewControllerWithIdentifier:@"HeaderViewController"];

上面的代码会导致这个问题,在我将 init代码更改为下面的代码之后,我解决了这个问题:

HeaderViewController *head_vc = [[HeaderViewController alloc] init];

对我来说,这是一个在 interfacebuilderbijctrl 拖动中创建的剩余连接。中断连接的名称出现在错误日志中

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

我有一个动作链接到一个按钮。按下按钮,应用程序崩溃,因为插座不再存在于我的代码。 在日志中寻找这个名字使我在故事板中找到了它。删除了它,然后崩溃就消失了!

我在使用 Swift3中的一些旧格式代码时遇到了这个问题,

let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(self.respond))

改变 action:"respond:"为行动: #selector(self.respond)为我解决了这个问题。

我也有同样的问题。

我删除了故事板上的按钮,重新创建了它,现在一切都很好。

这种情况发生在我身上是因为我不小心擦除了 UIViewcontroller 类代码中的“@IBAction func...”,所以在 Storyboard 中创建了 Reference Outlet,但是在运行时有任何函数来处理它。

解决方案是删除属性检查器中的 Outlet 引用,然后用命令键将其拖动到类代码中。

希望能有帮助!

我从 Swift 2切换到 Swift 3后就有了这个。下面的描述是特定的,但是您可以看到它的一般情况涵盖了许多可能的错误。

我在 SKNode的子类中有一个名为 delete的方法。

func delete(thing: SomeType)

UIResponder上已经有一个 delete方法,但是我的方法(无意中)重载了它,所以它工作得很好。升级到 Swift 3后改为:

func delete(_ thing: SomeType)

还在工作,但是后来我决定使用 Swift3ify,并强制使用参数:

func delete(thing: SomeType)

如果我记得更新调用者,那么这个方法就会工作得很好,但是我没有这样做,所以现在调用者正在使用错误类型的参数调用 UIResponder中的无参数名 delete方法。

这种情况显然可能发生在 SKNode(可能还有 UIView)上的任何一个以 Any为参数的标准方法列表中,这些方法将通过编译阶段,但是在调用时会出现故障。

我的案例是: CollectionView inside a View

我试图在我自己编写的 config()方法中添加手势识别器。 经过一些变通,我发现 我只需要在 awakeFromNib()中移动代码。

override func awakeFromNib() {


//other code


let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongGesture(gesture:)))
self.collectionView.addGestureRecognizer(longPressGesture)
}

而且效果很好。

我希望这能帮到某人。

就我而言:

我的协议定义

 @protocol MyProtocol


- (void)Method;


@end

我忘了实现委托方法。

希望能帮到别人。

在我的案例中,我在两个小时后解决了这个问题:

发送者(一个标签栏项目) 没有任何参考渠道。所以它指向无处。

只要 创造一个参考出口对应于您的函数即可。

希望这个能帮到你们。

好了,列队!我刚来 XCODE,遇到了这个问题,然后解决了!所以,如果这听起来像你,这里的答案是:

当您控制 + click 并将按钮拖动到 ViewController 文件(以便编写代码)时,您将被要求在弹出窗口中填写按钮的属性。

弹出窗口的底部(类型下)将说“发件人”。

你得把它改成“无”

在我的例子中,在 iOS13中,我只需要实现放在主线程中的整个函数和选择器调用部分。

如何调试“无法识别的选择器发送到实例”

在大多数情况下,Xcode 不会将我们带到这个问题发生的确切位置。当应用程序崩溃时,你不会看到导致这种情况的代码行,而是会被带到应用程序委托类,错误输出如下:

[UITableViewCellContentView image]: unrecognized selector sent to instance

或者

[__NSDictionaryI objectAtIndex:] unrecognized selector sent to instance

或者

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[TestApp.MyViewController viewDidLoad:]: unrecognized selector sent to instance 0xDABCDD'

如何找到导致这种情况的代码行:

转到断点导航器。单击“ +”选项。单击“异常断点”。将出现一个如下所示的新小部件。

enter image description here

添加以下条件块:

-[NSObject(NSObject) doesNotRecognizeSelector:]

enter image description here

还可以为所有异常设置断点。 现在再次运行代码。这一次,当发生异常时将触发断点。

作者: Prafulla Singh

详细说明: https://prafullkumar77.medium.com/how-to-debug-unrecognized-selector-send-to-instance-402473bc23d