我最近使用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'
答案 0 :(得分:1)
这是对象过早释放的典型症状。检查您的内存管理代码并注意引用计数(跟踪调用retain
,copy
,mutableCopy
,release
和autorelease
的时间/次数
答案 1 :(得分:1)
这很可能是一个已经被释放,被删除并且内存被另一个对象重用的对象的情况
答案 2 :(得分:0)
我选择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{...}
块,其中包含更多或更少的整个线程代码。