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