0

次のコードでクラッシュの問題に直面しています (アドホック ビルドのみ)。

- (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

問題は、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 に答える