iOS崩溃报告:接收错误选择器的随机对象

时间:2013-02-06 14:41:31

标签: iphone ios debugging crash crash-reports

我最近使用HockeyApp设置我的应用程序来跟踪崩溃报告。我收到了很多有用的报告,我用它来修复bug。但是,我得到了一堆崩溃报告,这些报告给导致崩溃的原因提供了非常奇怪的解释。例如,见这个:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_NSFaultingMutableSet alertView:didDismissWithButtonIndex:]: unrecognized selector sent to instance 0x1f2cd490'

现在,我在应用中有很多地方alertView:didDismissWithButtonIndex:,但我从来没有通过NSMutableSet来称呼它。有许多类似的崩溃,其中选择器根本不隶属于被称为调用它的对象。什么可以解释这些类型的崩溃,我该如何解决它们?


编辑:

首先,正如我在一些答案的评论中所解释的那样,我正在使用ARC。此外,还有一些其他示例,让您了解应用程序中发生的事情:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSConcreteMutableAttributedString intValue]: unrecognized selector sent to instance 0x1ed29a90'


*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSMallocBlock__ myOwnInternalMethod]: unrecognized selector sent to instance 0x1edcf440'

4 个答案:

答案 0 :(得分:1)

这是对象过早释放的典型症状。检查您的内存管理代码并注意引用计数(跟踪调用retaincopymutableCopyreleaseautorelease的时间/次数

答案 1 :(得分:1)

这很可能是一个已经被释放,被删除并且内存被另一个对象重用的对象的情况

答案 2 :(得分:0)

你正在使用ARC吗?如果没有,当您释放(或自动释放)一个Object并且之后没有将对该Object的所有引用(例如委托)设置为nil时,大多数崩溃都会发生。

我选择ScrollView作为示例。

@interface MyExampleController : UIViewController <UIScrollViewDelegate>
@property(nonatomic, strong) UIScrollView *scrollView;

@end


@implementation MyExampleController

- (UIScrollView *)scrollView
{
    if (!_scrollView) {
        _scrollView = [[UITableView alloc] initWithFrame:CGRectZero];
        [_scrollView setDelegate:self];
    }
    return _scrollView;
}

- (void)dealloc
{
    // Normaly the ScrollView should die the same time the Controller does
    // but sometimes another object might hold a reference
    // so the delegate has to be set to nil to prevent the ScrollView to call an Object no longer exist
    [_scrollView setDelegate:nil];
}

@end

答案 3 :(得分:0)

我同意H2CO3,Daij-Djan和Jonathan Cichon,原因可能是消息被发送到解除分配的对象。
这种情况发生的一个原因是,如果您有一个没有设置自动释放池的线程,并且您创建了一个自动释放对象。在这种情况下,它不会被保留,因为不存在自动释放池,并且在分配后立即解除分配。因此,如果您有多线程代码,请检查所有线程是否都有@autoreleasepool{...}块,其中包含更多或更少的整个线程代码。