1

このコードがシミュレーターで実行され、実際のデバイスでクラッシュするのはなぜですか?

円を描く非常に単純なコードがあります。コードはサブクラスUIView化され、シミュレーターで正常に実行されます (iOS 5.1 と iOS 6.0 の両方)。

Circle.h

#import <UIKit/UIKit.h>

@interface Circle : UIView

@end

Circle.m

#import "Circle.h"

@implementation Circle

-(CGPathRef) circlePath{
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path addArcWithCenter:self.center radius:10.0 startAngle:0.0 endAngle:360.0 clockwise:YES];
    return path.CGPath;
}

- (void)drawRect:(CGRect)rect
{
    CGPathRef circle = [self circlePath];

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextAddPath( ctx, circle );
    CGContextStrokePath(ctx);
}

@end

iOS 5.1.1 を実行している iPad2 でコードを実行しようとするとEXC_BAD_ACCESS(code=EXC_ARM_DA_ALIGN,address=0x31459241)、行にエラー ( ) が表示されCGContextAddPath( ctx, circle );ます。

私は問題が何であるかの手がかりがありません。この問題を解決するために誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

0

これは、返されるものが、メソッドで作成されCGPathたautoreleasedによって所有されているためです。パスオブジェクトを追加する時点で、は解放されているため、返されたポインタは無効なメモリを指しています。自分自身を返すことでクラッシュを修正できます。UIBezierPathcirclePathUIBezierPathUIBezierPath

-(UIBezierPath *)circlePath {
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path addArcWithCenter:self.center radius:10.0 startAngle:0.0 endAngle:360.0 clockwise:YES];
    return path;
}

次に、以下を使用して描画します。

CGContextAddPath( ctx, circle.CGPath );
于 2013-01-02T22:20:59.737 に答える