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


100

我正在为表格视图创建自定义表格单元格视图。将自定义单元格(在情节提要中)的图像视图快速连接到代码后,出现以下错误。

[UITableViewCellContentView image]: unrecognized selector sent to instance 0x7fb4fad7fd20'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010ccbb3f5 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010e7e9bb7 objc_exception_throw + 45
    2   CoreFoundation                      0x000000010ccc250d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x000000010cc1a7fc ___forwarding___ + 988
    4   CoreFoundation                      0x000000010cc1a398 _CF_forwarding_prep_0 + 120
    5   UIKit                               0x000000010d7d8881 -[UITableViewCell _marginWidth] + 151
    6   UIKit                               0x000000010d7ca23d -[UITableViewCell _separatorFrame] + 70
    7   UIKit                               0x000000010d7ca6fa -[UITableViewCell _updateSeparatorContent] + 360
    8   UIKit                               0x000000010d7d4e85 -[UITableViewCell _setSectionLocation:animated:forceBackgroundSetup:] + 1174
    9   UIKit                               0x000000010d634ea8 __53-[UITableView _configureCellForDisplay:forIndexPath:]_block_invoke + 1822
    10  UIKit                               0x000000010d5b5eae +[UIView(Animation) performWithoutAnimation:] + 65
    11  UIKit                               0x000000010d63477b -[UITableView _configureCellForDisplay:forIndexPath:] + 312
    12  UIKit                               0x000000010d63bcec -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 533
    13  UIKit                               0x000000010d61b7f1 -[UITableView _updateVisibleCellsNow:isRecursive:] + 2846
    14  UIKit                               0x000000010d63165c -[UITableView layoutSubviews] + 213
    15  UIKit                               0x000000010d5be199 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 521
    16  QuartzCore                          0x00000001114b6f98 -[CALayer layoutSublayers] + 150
    17  QuartzCore                          0x00000001114abbbe _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
    18  QuartzCore                          0x00000001114aba2e _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
    19  QuartzCore                          0x0000000111419ade _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 242
    20  QuartzCore                          0x000000011141abea _ZN2CA11Transaction6commitEv + 390
    21  QuartzCore                          0x000000011141b255 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 89
    22  CoreFoundation                      0x000000010cbf0347 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
    23  CoreFoundation                      0x000000010cbf02a0 __CFRunLoopDoObservers + 368
    24  CoreFoundation                      0x000000010cbe60d3 __CFRunLoopRun + 1123
    25  CoreFoundation                      0x000000010cbe5a06 CFRunLoopRunSpecific + 470
    26  GraphicsServices                    0x0000000110daa9f0 GSEventRunModal + 161
    27  UIKit                               0x000000010d545550 UIApplicationMain + 1282
    28  TestWork                          0x000000010caa432e top_level_code + 78
    29  TestWork                          0x000000010caa436a main + 42
    30  libdyld.dylib                       0x000000010efc3145 start + 1
    31  ???                                 0x0000000000000001 0x0 + 1
)

您能告诉我如何解决此错误吗?

谢谢。

我在项目中添加了一个异常断点。

这是断线。

  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = self.tableView.dequeueReusableCellWithIdentifier(kCellIdentifier) as ItemTableViewCell  <---------------

但是我在代码中不使用“图像”。


2
您在image]某个地方打电话..但是在错误的对象上。错误的第一行告诉您很多
ccwasden 2014年

1
停止在UITableViewCellContentView上调用[image]-这将解决该问题。向我们显示导致此崩溃的代码。
Grzegorz Krukowski

1
我认为您在tableViewCell中使用了一些图像,但是该图像可能不在您的捆绑包中。
南德·帕里克

Answers:


102

尝试在上设置符号断点-[NSObject(NSObject) doesNotRecognizeSelector:]。只需单击[+]Breakpoint Navigator的左下角即可添加一个断点。然后单击“添加符号断点”。现在,重现崩溃应该可以使您更好地了解代码中出现问题的位置。

在此处输入图片说明


17
也可以只添加一个异常断点
rebello95

1
救了我的一天,兄弟。
AntiMoron '16

1
谢谢您,它是如此有用
Mohd Sadham

35

您可以使用轻松跟踪此类崩溃Exception Breakpoints

打开Breakpoint Navigator并添加

在此处输入图片说明

添加“异常断点”后,将打开用于选择的选项Exception

在此处输入图片说明

选择Objective-C

运行代码并使应用程序崩溃,断点将使您停在代码崩溃的位置。


它发生在AppDelegate的第1行上。:(
丹尼尔·斯普林格

您可以显示一些用AppDelegate编写的代码吗?暂停断点的地方。以及日志。
Vatsal K

它暂停在声明应用程序委托的第1行上
Daniel Springer

在某些情况下,由于某些框架的缘故,它会暂停,但是请不要担心您可能需要按Continue按钮3-4次才能运行该应用程序。
Vatsal K

在这种情况下这不是错误,某些旧框架正在引起这种问题。尝试通过将旧框架更新为新框架来进行尝试。那应该解决问题。
Vatsal K

30

关键的第一步是分析错误消息:

[UITableViewCellContentView image]: unrecognized selector sent to instance

这告诉您“消息” image已“发送”到类UITableViewCellContentView的对象。(换句话说,试图在image类UITableViewCellContentView的对象上调用该方法。)

首先要问的是“这有任何意义吗?” 可能是命名的类具有Image方法,但没有image方法,因此在调用中使用了错误的方法名称。也可能是命名方法是someMethod:someParm:,但是类实现someMethod:someParm:anotherParm:,这意味着在调用中省略了参数。

但是,大多数情况下,命名类甚至没有与命名方法相似的任何方法,这意味着在失败的调用中使用了指向错误对象的指针。

例如,可以这样做:

NSArray* myArray = [myDictionary objectForKey:@"values"];
NSString* myString = [myArray objectAtIndex:5];

并得到以下错误:

[__NSDictionaryI objectAtIndex:] unrecognized selector sent to instance

因为从中检索到的对象myDictionary实际上是NSDictionary,而不是预期的NSArray。

不幸的是,最令人困惑的是,此类错误发生在UI系统代码中而不是您自己的代码中。当您以某种方式将错误的对象传递给系统接口,或者在Interface Builder或任何地方配置了错误的类时,就会发生这种情况。


6

另一个可能的原因是原始对象被销毁,然后另一个对象被分配到了相同的内存地址。然后,您的代码发送该消息,认为它仍然具有指向旧对象的指针,并且Objective-C抛出异常,因为新对象不理解该消息。

要诊断此问题,请使用“僵尸”检测运行Profiler。


2

斯威夫特5.0

您可以使用自省功能来发现对象是否响应特定的选择器。

let canWork = yourObject.respondsToSelector(Selector("image"))   // true

只有在代码正确的情况下才可以工作..否则它肯定会崩溃


1

在这些情况下,我发现看两件事很有帮助

  1. 调用栈
  2. 每个堆栈帧的局部变量(及其类型)

当我遇到此错误时,通常是因为当我期望Type B时,我向Type A的实例发送了一条消息。

在这种特定情况下,您可能无法满足父类的要求(鉴于您的ItemTableViewCell实例很可能继承)。

您能否向我们展示您的ItemTableViewCell类的代码?


1

您可以使用以下代码声明变量:

let noteListTableViewCellobject = "NoteListTableViewCell";` `// Note listTablecell create custom cell`

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {

    var cell:NoteListTableViewCell? = tableView.dequeueReusableCellWithIdentifier(noteListTableViewCellobject) as? NoteListTableViewCell

    if (cell == nil) {
        let nib:Array = NSBundle.mainBundle().loadNibNamed("NoteListTableViewCell", owner: self, options: nil)
        cell = nib[0] as? NoteListTableViewCell
    }
}

0

我有同样的问题,这对我有用:

在您的SKScene中覆盖isEqual:

- (BOOL)isEqual:(id)other {

    if (![other isMemberOfClass:[SKScene class]]) {
        return false;
    }
    return [super isEqual:other];
}

0

您必须通过indexPath声明tableview单元的对象。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)

    return cell
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.