7

我正在使用 testflight 来测试我的应用程序,并且只有当应用程序是为临时构建并通过测试飞行分发时才会发生崩溃。相关的崩溃报告详细信息是:

Date/Time:       2012-06-11 09:00:34.638 +0800
OS Version:      iPhone OS 5.1.1 (9B206)
Report Version:  104

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000009
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libobjc.A.dylib                 0x34e74f78 objc_msgSend + 16
1   appName                         0x0002963e __24-[XYPieChart reloadData]_block_invoke_0168 (XYPieChart.m:321)
2   libdispatch.dylib               0x30295c52 _dispatch_call_block_and_release + 6
3   libdispatch.dylib               0x302a0e8a _dispatch_main_queue_callback_4CF$VARIANT$up + 190
4   CoreFoundation                  0x371482a6 __CFRunLoopRun + 1262
5   CoreFoundation                  0x370cb49e CFRunLoopRunSpecific + 294
6   CoreFoundation                  0x370cb366 CFRunLoopRunInMode + 98
7   GraphicsServices                0x3388a432 GSEventRunModal + 130
8   UIKit                           0x30e77cce UIApplicationMain + 1074
9   appName                         0x00003b20 main (main.m:14)
10  appName                         0x00003ad8 0x1000 + 10968

以及引用的代码 - (XYPieChart.m:321)

    [CATransaction begin];
    [CATransaction setAnimationDuration:_animationSpeed];

    [_pieView setUserInteractionEnabled:NO];

    __block NSMutableArray *layersToRemove = nil;
    [CATransaction setCompletionBlock:^{

        if (layersToRemove) {
            [layersToRemove enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
                if (obj)
                    [obj removeFromSuperlayer];
            }];

            [layersToRemove removeAllObjects];
        }

        for(SliceLayer *layer in _pieView.layer.sublayers)
        {
            [layer setZPosition:kDefaultSliceZOrder];
        }

        [_pieView setUserInteractionEnabled:YES];
    }];

    BOOL isOnStart = ([slicelayers count] == 0 && sliceCount);
    NSInteger diff = sliceCount - [slicelayers count];
    layersToRemove = [NSMutableArray arrayWithArray:slicelayers];

    BOOL isOnEnd = ([slicelayers count] && (sliceCount == 0 || sum <= 0));
    if(isOnEnd)
    {
        for(SliceLayer *layer in _pieView.layer.sublayers){
            [self updateLabelForLayer:layer value:0];
            [layer createArcAnimationForKey:@"startAngle"
                                  fromValue:[NSNumber numberWithDouble:_startPieAngle]
                                    toValue:[NSNumber numberWithDouble:_startPieAngle] 
                                   Delegate:self];
            [layer createArcAnimationForKey:@"endAngle" 
                                  fromValue:[NSNumber numberWithDouble:_startPieAngle]
                                    toValue:[NSNumber numberWithDouble:_startPieAngle] 
                                   Delegate:self];
        }
        [CATransaction commit];
        return;
    }

如果我可以在调试时重现它,我将能够追踪问题,但它似乎只在为临时构建时才会发生。谢谢!

编辑:使用模拟器,我已经在这一行找到了 EXC_BAD_ACCESS 的问题

[layersToRemove enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
4

4 回答 4

9

我遇到了类似的问题并尝试更改项目构建设置,但它对我不起作用。最终通过更改版本的编译器优化级别设置解决了我的问题:

在构建设置中,转到 LLVM 编译器 4.2 - 代码生成部分,查找优化级别选项并将发布设置从最快、最小 [-Os] 更改为无 [-O0]。

希望这可以帮助!

于 2013-02-06T13:55:33.610 回答
8

更改您的 Xcode 方案,以便您可以测试和调试发布版本,该版本使用与您的 Ad Hoc 版本相同的编译器优化。调试 Debug 版本不会。

于 2012-06-11T03:38:08.670 回答
6

我最终解决了这个问题。在我的编译器设置中,不知何故,没有为 Ad-Hoc 构建启用 ARC,从而导致奇怪的行为。在我解决这个问题之前,分配 __block 变量是有效的,因为在非 ARC 环境中,__block 变量不会自动保留。

更改了编译器设置,以便所有构建都使用 ARC 并且所有内容都已修复。

于 2012-06-11T06:42:56.717 回答
3

就我而言,是“启用僵尸对象”设置阻止了调试模式下的崩溃。没有此设置的 Debuggin 也会使应用程序在调试器中崩溃,从而很容易找到罪魁祸首。

所以我建议禁用“诊断”菜单中的所有设置并将优化设置为 -Os 并在发布前进行最终测试。或者正如 hotpaw2 指出的那样,在发布模式下构建。但由于证书设置问题,这对我不起作用。

于 2015-09-30T18:57:22.700 回答