另一个“发送到实例的无法识别的选择器”

Posted

技术标签:

【中文标题】另一个“发送到实例的无法识别的选择器”【英文标题】:Another "unrecognized selector sent to instance" 【发布时间】:2015-10-17 20:42:29 【问题描述】:

编辑 3:

对于遇到此错误的其他人,这就是这里发生的情况。

我最初将滑块的 IBAction 创建为“numberOfSounds”。 然后我创建了一个名为“numberOfSounds”的类属性并重命名 IBAction 到“sliderValueChanged”。

我希望连接会自动更新连接,但是 它没有。所以,由于我愚蠢地为变量使用了相同的名称,我 错过了连接。请参阅下面的@rob 接受的答案以获取信息 线索。

解决方案是删除之前的连接,并从情节提要中的滑块控制拖动到 ViewController 中的 sliderValueChanged IBAction。

原问题:

我遇到了这个极其常见的错误,并且像许多其他人一样,我很难理解修复方法。操作滑块会导致崩溃,也就是这条消息:

2015-10-17 13:35:59.765 测试应用程序[25969:2985698] *** 终止应用程序 由于未捕获的异常“NSInvalidArgumentException”,原因: '-[Test_App.ViewController numberOfSounds:]: 无法识别的选择器 发送到实例 0x7fc439e26740'

断点在“numberOfSounds = Int(sender.value)”上。

import UIKit
import AVFoundation

class ViewController: UIViewController 
  var numberOfSounds: Int = 0

  @IBAction func sliderValueChanged(sender: UISlider) 
    numberOfSounds = Int(sender.value)
  

我想我理解了一些问题,尽管 numberOfSounds 是 ViewController 的一个属性,但它在 sliderValueChanged 范围内不可用。

我已经阅读了前 15-20 个 google 搜索“发送到实例的无法识别的选择器”,但仍然没有找到似乎可以解决问题的内容。

感谢您的帮助。

编辑:(添加更多代码)

class ViewController: UIViewController 
  var numberOfSounds: Int = 0

  @IBAction func sliderValueChanged(sender: UISlider) 
    numberOfSounds = Int(sender.value)
  
  @IBOutlet weak var numberOfSoundsLabel: UILabel!
  @IBAction func PlaySound(sender: UIButton) 

  required init?(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)
  

  override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
  

  override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
  

编辑 2:(添加完整的堆栈跟踪)

2015-10-17 13:59:24.303 测试应用程序[26230:3006546] -[Test_App.ViewController numberOfSounds:]:无法识别的选择器发送到实例 0x7fedea730350 2015-10-17 13:59:24.313 测试 App[26230:3006546] * 由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'-[Test_App.ViewController numberOfSounds:]: 无法识别的选择器发送到实例 0x7fedea730350' * 第一次抛出调用堆栈:( 0 CoreFoundation 0x000000010a7d7f65 exceptionPreprocess + 165 1 libobjc.A.dylib 0x000000010c469deb objc_exception_throw + 48 2 核心基础 0x000000010a7e058d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205 3 核心基础 0x000000010a72df7a ___forwarding_ + 970 4 CoreFoundation 0x000000010a72db28 _CF_forwarding_prep_0 + 120 5 UIKit 0x000000010aff41fa -[UIApplication sendAction:to:from:forEvent:] + 92 6 UIKit 0x000000010b158504 -[UIControl sendAction:to:forEvent:] + 67 7 UIKit 0x000000010b1587d0 -[UIControl_sendActionsForEvents:withEvent:] + 311 8 UIKit 0x000000010b244770-[UISlider beginTrackingWithTouch:withEvent:] + 1083 9 UIKit 0x000000010b15739d -[UIControl touchesBegan:withEvent:] + 136 10 UIKit 0x000000010b05e894 -[UIWindow _sendTouchesForEvent:] + 308 11 UIKit 0x000000010b05f691 -[UIWindow sendEvent:] + 865 12 UIKit 0x000000010b011752 -[UIApplication sendEvent:] + 263 13 UIKit 0x000000010afecfcc _UIApplicationHandleEventQueue + 6693 14 核心基础 0x000000010a7040a1 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 17 15 核心基础 0x000000010a6f9fcc __CFRunLoopDoSources0 + 556 16 CoreFoundation 0x000000010a6f9483 __CFRunLoopRun + 867 17 CoreFoundation 0x000000010a6f8e98 CFRunLoopRunSpecific + 488 18 图形服务 0x000000010ed6cad2 GSEventRunModal + 161 19 UIKit 0x000000010aff2676 UIApplicationMain + 171 20 测试应用 0x000000010a5fc1ad 主 + 109 21 libdyld.dylib 0x000000010cfb092d 开始 + 1 22 ??? 0x0000000000000001 0x0 + 1)

【问题讨论】:

您确定代码确实导致了问题,并且那是您 Xcode 中的确切代码,只是复制它(不是重新输入它?)因为在操场上复制它并调用该函数没有任何问题 @luk2302 它应该。它是更多不相关代码的子集。嗯,让我快速测试一下。 pastebin.com/Di7pYwmN 例如可以正常工作 :/ 应该这样,还没有任何可能出错的地方^^ 清除所有断点并在遇到异常时检查堆栈回溯。如图所示的代码有效 @Paulw11 这不是错误消息所说的。故事板中的控件连接到名为“numberOfSounds:”的操作,该操作未在“ViewController”中实现。这是一个动作,而不是一个属性获取器。 【参考方案1】:

明显的问题是-[Test_App.ViewController numberOfSounds:] 中存在冒号。这意味着你有一些东西试图用一个参数调用一个名为 numberOfSounds: 的方法。

假设您的代码中没有任何可以执行此操作的内容,我会仔细检查“连接检查器”IB 中滑块的插座/操作,并确保您没有类似以下操作:

这将导致您描述的错误消息。如果您有任何与上述无关的操作,只需单击小“x”即可将其删除。

--

如果您曾经尝试将一个动作从滑块连接到您的视图控制器,调用动作numberOfSounds,但随后在看到IBAction 代码时意识到错误并继续删除/编辑@987654327,就会发生这种情况@ 代码中的函数,但也忽略了调整 IB 中的连接。这是一个常见的工作流程,会导致这种行为。

【讨论】:

好的,我有正是您的剪辑显示的内容。我想了解这里发生了什么。我最初通过从情节提要中的滑块控制拖动到 ViewController 窗口来创建 IBAction。所以我假设我们在这里看到的连接是由 Xcode 自动建立的。对吗? 谢谢罗伯!这就是发生的事情。当我最初建立连接时,IBAction 被命名为“numberOfSounds”。后来,我将 numberOfSounds 添加为类属性,并将 IBAction 重命名以更好地反映其用途。我天真地假设连接也将被重命名。我错过了,因为我重用了 numberOfSounds。 是的,可以。将此解释添加到我的答案中。 使用查找和替换重命名您的操作不会重命名 IB 中的链接。但是,如果您在编辑器中选择 IBAction 的名称,选择“重构”并使用重构工具重命名该方法,它会在任何地方更改它,包括更改 IB 中的链接。

以上是关于另一个“发送到实例的无法识别的选择器”的主要内容,如果未能解决你的问题,请参考以下文章

快速代码崩溃:“发送到实例的无法识别的选择器”

NSInvalidArgumentException,使用 performSegueWithIdentifier 时发送到实例的无法识别的选择器

[UIBarButtonItem _isAncestorOfFirstResponder]:发送到实例的无法识别的选择器

[__NSCFString name]:发送到实例的无法识别的选择器

如何解决“发送到实例的无法识别的选择器”?

Monotouch - [NSConcreteValue doubleValue]:发送到实例的无法识别的选择器