0

我在以下代码中遇到了崩溃问题(仅在 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下工作。

4

2 回答 2

0

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


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

它几乎可以在任何地方;因为对象变量“某处”指向内存的随机位。

你可以试试 Xcode 中的分析工具,看看它是否能找到任何东西。除此之外,您必须从崩溃的对象通过其父对象向后工作,并检查所有内容是否已正确初始化。

于 2013-03-18T11:50:49.740 回答
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);
于 2013-03-18T15:02:30.917 回答