我正在使用testflight来测试我的应用程序,我发生了崩溃,只有当应用程序是为ad-hoc构建并通过测试飞行分发时才会发生。相关的崩溃报告详细信息如下:
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;
}
如果我可以在调试时重现它,我将能够追踪问题,但它似乎只是在为ad-hoc构建时才会发生。谢谢!
编辑: 使用模拟器,我已将问题跟踪到此行的EXC_BAD_ACCESS
[layersToRemove enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
答案 0 :(得分:8)
更改您的Xcode Scheme,以便您可以测试和调试Release版本,该版本使用与Ad Hoc构建相同的编译器优化。调试Debug构建不会。
答案 1 :(得分:8)
我有类似的问题并尝试更改项目构建设置,但它对我不起作用。最终通过更改发行版的编译器优化级别设置解决了我的问题:
在Build Settings中,转到LLVM编译器4.2 - 代码生成部分,查找优化级别选项并将Release设置从Fastest,Smallest [-Os]更改为None [-O0]。
希望这有帮助!
答案 2 :(得分:6)
我最终解决了这个问题。在我的编译器设置中,不知何故,ARC没有为Ad-Hoc构建启用,导致奇怪的行为。在我解决之前,分配__block变量是有效的,因为在非ARC环境中,__block变量不会自动保留。
更改了编译器设置,以便所有构建都使用ARC并且所有内容都已修复。
答案 3 :(得分:1)
在我的情况下,它是“启用僵尸对象”设置,可防止在调试模式下崩溃。没有这个设置的Debuggin使得应用程序也在调试器中崩溃,从而很容易找到罪魁祸首。
所以我建议禁用“diagnostics”菜单中的所有设置,并将优化设置为-Os并在发布之前进行最终测试。或者正如hotpaw2指出的那样,构建在发布模式中。但由于证书设置问题,这对我不起作用。