绘图时ad-hoc构建中的崩溃问题

时间:2013-03-18 10:54:15

标签: ios core-graphics

我在以下代码中遇到崩溃问题(仅在Ad-Hoc构建中)。

- (void)drawPreviewInRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);

    CGColorRef strokeColor = [self.delegate.strokeColor CGColor];
    CGFloat strokeWidth = self.delegate.strokeWidth;

    CGFloat x = rect.size.width/2.0f;
    CGFloat y = rect.size.height/2.0f;
    CGPoint strokePoint = CGPointMake(x, y);

    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetLineWidth(context, strokeWidth);
    CGContextSetStrokeColorWithColor(context, strokeColor);

    CGContextMoveToPoint(context, strokePoint.x, strokePoint.y);
    CGContextAddLineToPoint(context, strokePoint.x, strokePoint.y);
    CGContextStrokePath(context);

    CGContextRestoreGState(context);
}

崩溃日志显示以下图片:

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

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libobjc.A.dylib                 0x39f535b0 objc_msgSend + 16
1   CoreGraphics                    0x3237c3ec CGColorRetain + 12
2   CoreGraphics                    0x3237c592 CGGStateSetStrokeColor + 38

代码在开发环境中完美运行(在模拟器和设备上)。任何理论?我在ARC工作。

2 个答案:

答案 0 :(得分:0)

快速猜测:self.delegate中的nil未设置为init,导致CGColor在随机内存位上被调用。


更详细:在开发期间,构建对象变量往往都设置为友好的nil值。当您进行发布版本时,情况并非如此。像这样的崩溃最有可能是没有被初始化为nil的东西。

它几乎可以在任何地方;因为对象变量'somewhere'指向一个随机的内存位。

您可以尝试使用Xcode中的Analyze工具查看它是否可以检测到任何内容。除此之外,你将不得不从它通过它的父母崩溃的对象向后工作,并检查所有内容是否很好地初始化。

答案 1 :(得分:0)

问题在于对象保留和释放 - 这是由ARC处理的。显然,ARC仍有一些问题,特别是UIColor - > CGColor。这里解释了这个问题:http://blog.bignerdranch.com/296-arc-gotcha-unexpectedly-short-lifetimes/

我将以下行更改为代码:

CGContextSetLineWidth(context, strokeWidth);
CGContextSetStrokeColorWithColor(context, strokeColor);

到此,它现在正在运作:

CGContextSetLineWidth(context, self.delegate.strokeWidth);
CGContextSetStrokeColorWithColor(context, self.delegate.strokeColor.CGColor);