0

我最近使用 HockeyApp 设置了我的应用程序来跟踪崩溃报告。我收到了许多有用的报告,用于修复错误。但是,我收到了一堆崩溃报告,它们对导致崩溃的原因给出了非常奇怪的解释。例如看这个:

*** 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

4 回答 4

1

这是对象过早释放的典型症状。检查您的内存管理代码并注意引用计数(跟踪何时/多少次、、、retaincopy被调用)mutableCopyreleaseautorelease

于 2013-02-06T14:45:44.867 回答
1

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

于 2013-02-06T14:46:00.247 回答
0

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

于 2013-02-06T15:59:46.917 回答
0

你在用ARC吗?如果不是这样,大多数崩溃发生在您释放(或自动释放)一个对象并且之后没有将对该对象的所有引用(例如委托)设置为 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
于 2013-02-06T14:45:35.610 回答