0

並行 ns 操作を実装し、ARC を有効にしました。現在、私の顧客は、私が再現できないクラッシュを経験しています。彼は私に次のクラッシュログを送ってくれました:

Date/Time:       2013-04-24 12:23:34.925 -0400
OS Version:      Mac OS X 10.8.3 (12D78)
Report Version:  10

Interval Since Last Report:          30946 sec
Crashes Since Last Report:           1
Per-App Interval Since Last Report:  33196 sec
Per-App Crashes Since Last Report:   1
Anonymous UUID:                      FB8460EE-5199-C6FB-55DC-F927D7F81A80

Crashed Thread:  15  Dispatch queue: com.apple.root.default-priority

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: EXC_I386_GPFLT

Application Specific Information:
objc_msgSend() selector name: isCancelled


Thread 15 Crashed:: Dispatch queue: com.apple.root.default-priority
0   libobjc.A.dylib                 0x00007fff877f1250 objc_msgSend + 16
1   Myapp   0x000000010a608807 0x10a601000 + 30727
2   Myapp   0x000000010a650575 0x10a601000 + 324981
3   com.apple.Foundation            0x00007fff8b66212f -[NSBlockOperation main] + 124
4   com.apple.Foundation            0x00007fff8b638036 -[__NSOperationInternal start] + 684
5   com.apple.Foundation            0x00007fff8b63f861 __block_global_6 + 129
6   libdispatch.dylib               0x00007fff832d0f01 _dispatch_call_block_and_release + 15
7   libdispatch.dylib               0x00007fff832cd0b6 _dispatch_client_callout + 8
8   libdispatch.dylib               0x00007fff832ce1fa _dispatch_worker_thread2 + 304
9   libsystem_c.dylib               0x00007fff87d19d0b _pthread_wqthread + 404
10  libsystem_c.dylib               0x00007fff87d041d1 start_wqthread + 13

私のコードは次のようになります。

-(void)start
{        
    // Always check for cancellation before launching the task.
    if ([self isCancelled])
    {
        // Must move the operation to the finished state if it is canceled.
        [self onCancelSyncOperation];
        return;
    }

    // If the operation is not canceled, begin executing the task.
    [self willChangeValueForKey:@"isExecuting"];
    [NSThread detachNewThreadSelector:@selector(main) toTarget:self withObject:nil];
    executing = YES;
    [self didChangeValueForKey:@"isExecuting"];
}

- (void)onCancelSyncOperation
{
    [self willChangeValueForKey:@"isFinished"];
    [self willChangeValueForKey:@"isExecuting"];

    executing = NO;
    finished = YES;

    [self didChangeValueForKey:@"isExecuting"];
    [self didChangeValueForKey:@"isFinished"];
}

nsoperation はもうリリースされているようですが?isCancelled をチェックしようとすると?

これは可能ですか?

4

1 に答える 1

0

このログを見て、アプリがクラッシュする理由を説明できる人はいないと思います。私はあなたのコードを見ていませんが、クラッシュログを切り取ったので、システムモジュール (lib.dispatch..., com.apple...) だけが表示されます。通常、エラーは「com.myname...」の最初の出現にあります。

この種のクラッシュEXC_BAD_ACCESS (SIGSEGV)が とともに表示される場合はobjc_msgSend()おそらく、もう存在しないオブジェクトにメッセージを送信しようとしている (つまり、オブジェクトのメソッドを呼び出している) ことを意味します。そのオブジェクトを呼び出すと、見つかる可能性が非常に高くなりますが、遅延して呼び出したり、別のスレッドで呼び出したり、ブロックから呼び出したりすると、少し複雑になります。

この原因を見つける最善の方法は、Instrument でアプリを検査することです。NSZombies が有効になっている (これがデフォルトです) 状態で Allocations or Leaks ツールを使用します。Xcode 内から Instruments を起動できます。次に、クラッシュを再現してみてください。成功すると、クラッシュが発生したクラスと場所を見つけることができる場合があります。

この回答をどうすればよいかわからない場合は、Apple の WWDC 開発者ビデオをチェックしてください。Instruments を使用してアプリをプロファイリングする方法を示すものがあります (ビデオにアクセスするには [無料] 開発者アカウントが必要です)。 )。

幸運を!

于 2013-05-27T09:39:39.420 に答える