2013-01-02 48 views
1

爲什麼此代碼在模擬器上運行並在實際設備上崩潰?在設備上運行時出現EXC_ARM_DA_ALIGN錯誤

我有一個非常簡單的代碼,繪製一個圓圈。該代碼的子類爲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);行。

我不知道問題出在哪裏。任何人都可以指出我正確的方向來解決這個問題嗎?

回答

0

這是因爲您要返回的CGPathcirclePath方法中創建的自動發行的UIBezierPath所有。當您添加路徑對象時,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); 
+0

謝謝,這解決了這一問題。我沒有收到一件事,爲什麼我的代碼在模擬器上運行? CGPath應該已經發布了,我錯了嗎? –

+0

@Xavi i386指令集比ARM更不挑剔。無論如何,模擬器從來都不是設備實際性能的良好基準。 – CodaFi

相關問題