1

为什么这段代码在模拟器上运行而在真实设备上崩溃?

我有一个非常简单的代码来绘制一个圆圈。代码子类UIView化并在模拟器上运行良好(适用于 iOS 5.1 和 iOS 6.0)。

圈子.h

#import <UIKit/UIKit.h>

@interface Circle : UIView

@end

圆.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您要返回的对象归方法UIBezierPath中创建的自动释放对象所有circlePath。当您添加UIBezierPath已释放的路径对象时,返回的指针指向无效内存。UIBezierPath您可以通过返回自身来修复崩溃:

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