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

これにより、1 日の大部分でクラッシュを追跡する必要がありました。Warren Burton の答えは私が見つけたものと同じで、ヘルパー クラス alloc/init を強力なプロパティに割り当てることで解決したので、デリゲートとして使用するために固執します。

それ以外の場合、弱い mylayer.delegate 参照は解放されないようにするのに十分ではありません。

これによるクラッシュも明らかではなく、window.makeKeyAndVisible の奥深くにあります。

于 2013-02-23T11:55:42.700 に答える