在设备上运行时EXC_ARM_DA_ALIGN错误(EXC_ARM_DA_ALIGN error w

2019-10-17 12:50发布

为什么在模拟器上运行并撞击在真实设备上的代码?

我有一个非常简单的代码绘制一个圆。 码的子类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

当我尝试在一个iPad2运行iOS执行代码5.1.1我得到一个错误( EXC_BAD_ACCESS(code=EXC_ARM_DA_ALIGN,address=0x31459241)CGContextAddPath( ctx, circle ); 线。

我也不懂是什么问题的线索。 任何人都可以点我在正确的方向来解决这个问题?

Answer 1:

这是因为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 );


文章来源: EXC_ARM_DA_ALIGN error when running on a device