0

我已经实现了并发 nsoperation 并启用了 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 或 Leaks 工具。您可以从 Xcode 中启动 Instruments。然后尝试重现您的崩溃。如果你成功了,你也许能够找到发生崩溃的类和位置。

如果您不知道如何处理此答案,请查看 Apple 的 WWDC 开发者视频,其中有一些展示了如何使用 Instruments 分析您的应用程序(您需要一个 [免费] 开发者帐户才能访问这些视频)。

祝你好运!

于 2013-05-27T09:39:39.420 回答