为calayer绘图添加委托会导致应用崩溃

时间:2012-10-20 15:51:21

标签: ios crash calayer

我在名为PieChartView.m的文件中编写了以下代码:

#pragma mark DrawingDelegate
@interface DrawingDelegate : NSObject
@end

@implementation DrawingDelegate

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
    //nothing here yet...
}

#pragma mark PieChartView
@implementation PieChartView

@synthesize pie_layer;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
            float pie_layer_width = 300.f;
            float pie_layer_height = 160.f;
            float pie_layer_PosX = 7.f;
            float pie_layer_PosY = 20.f;

            DrawingDelegate* layerDelegate = [[DrawingDelegate alloc] init];

            pie_layer = [[CALayer alloc] init];

            //when commenting the following assignment the app no longer crashes
            pie_layer.delegate = layerDelegate;
            pie_layer.bounds = CGRectMake( 0.f, 0.f, pie_layer_width, pie_layer_height );
            pie_layer.backgroundColor = [[UIColor whiteColor] CGColor];
            pie_layer.position = CGPointMake( pie_layer_width/2+pie_layer_PosX, pie_layer_height/2+pie_layer_PosY );
            pie_layer.cornerRadius = 10.f;
            CGFloat components[4] = { 0.0, 0.0, 0.0, 1.0 };

            CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
            CGColorRef black = CGColorCreate( colorspace, components );
            pie_layer.borderColor = black;
            pie_layer.borderWidth = 1.f;
            pie_layer.shadowRadius = 5.f;
            pie_layer.shadowColor = black;

            CGColorRelease( black );
            CGColorSpaceRelease(colorspace);

            pie_layer.shadowOffset = CGSizeMake( 0.f, 5.f ),
            pie_layer.shadowOpacity = 0.75f;
            [self.layer insertSublayer:pie_layer above:self.layer];
            [pie_layer setNeedsDisplay];
        }
        return self;
}

只要执行“pie_layer.delegate = layerDelegate;”行,应用程序就会崩溃。崩溃看起来像给定的截图。

enter image description here

为什么会这样?我的代码出了什么问题?

这是另一个更详细的堆栈跟踪: enter image description here

2 个答案:

答案 0 :(得分:1)

如果这是ARC并且代理人是weak那么绘图代表将被释放,因为没有任何东西拥有它。

按照惯例,代表很弱,但需要对您创建的DrawingDelegate对象保持strong引用。

答案 1 :(得分:0)

这让我在一天中的大部分时间都在追逐崩溃。 Warren Burton的答案与我找到的答案相同,我通过将辅助类alloc / init分配给一个强大的属性来解决它,所以它坚持用作委托。

否则弱mylayer.delegate引用不足以阻止它被释放。

这个崩溃也不明显,在window.makeKeyAndVisible内。