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

これは、オブジェクトの早期割り当て解除の典型的な症状です。retainメモリ管理コードを確認し、参照カウントに注意してください ( 、copymutableCopy、がいつ/何回呼び出されたかを追跡しますrelease) autorelease

于 2013-02-06T14:45:44.867 に答える
1

これは、オブジェクトが解放され、削除され、メモリが別のオブジェクトによって再利用される可能性が高いです。

于 2013-02-06T14:46:00.247 に答える
0

私はH2CO3、Daij-Djan、Jonathan Cichonに同意します。その理由は、おそらくメッセージが割り当て解除されたオブジェクトに送信されるためです。
これが発生する可能性がある理由の1つは、自動解放プールが設定されていないスレッドがあり、自動解放オブジェクトを作成する場合です。この場合、自動解放プールが存在しないため保持されず、割り当て直後に割り当てが解除されます。したがって、マルチスレッドコードがある場合は、すべてのスレッドに、@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 に答える