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スキームを変更して、アドホックビルドと同じコンパイラ最適化を使用するリリースビルドをテストおよびデバッグできるようにします。デバッグビルドのデバッグは行いません。

于 2012-06-11T03:38:08.670 に答える
6

私は問題を解決することになった。私のコンパイラ設定では、どういうわけか、アドホックビルドに対してARCが有効になっておらず、奇妙な動作が発生していました。これを解決する前は、__ block変数の割り当ては機能していました。これは、非ARC環境では、__block変数が自動的に保持されないためです。

すべてのビルドがARCを使用し、すべてが修正されるようにコンパイラ設定を変更しました。

于 2012-06-11T06:42:56.717 に答える
3

私の場合、デバッグモードでのクラッシュを防ぐのは「ゾンビオブジェクトを有効にする」設定でした。この設定なしでデバッグすると、アプリもデバッガーでクラッシュし、原因を簡単に見つけることができます。

したがって、「診断」メニューのすべての設定を無効にし、最適化を-Osに設定して、リリースする前に最終テストを行うことをお勧めします。または、hotpaw2が指摘したように、リリースモードでビルドします。しかし、証明書の設定に問題があるため、これは機能しませんでした。

于 2015-09-30T18:57:22.700 に答える