1

我在一个名为 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;”行,应用程序就会崩溃。崩溃看起来像给定的屏幕截图。

在此处输入图像描述

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

这是另一个更详细的堆栈跟踪: 在此处输入图像描述

4

2 回答 2

1

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

按照惯例,委托很弱,但需要保留strong对您创建的 DrawingDelegate 对象的引用。

于 2012-10-20T16:26:51.333 回答
0

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

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

这个崩溃也不明显,在 window.makeKeyAndVisible 的深处。

于 2013-02-23T11:55:42.700 回答