Die Zuordnung eines Delegierten auf einen CALayer ist sublayer wirft EXC_BAD_ACCESS?

Ich versuche, eine Reihe von CALayers als Unterschichten eine Sicht, die braucht ein wenig mehr feinkörnige Zeichnung als üblich. Ich habe mit CATiledLayer vor, und ich dachte, mit Unterebenen wäre einfacher, wenn nicht gleich pingelig. Ich dachte, ich führe eine [self.layer addSublayer:sublayer] legen die Delegierten, dass " neue Unterebene und dann ziehe ich alles was ich will in der drawLayer:inContext: Methode. Aber zu meiner großen überraschung, meine app stürzt auf addSubview: (ohne IB) oder irgendwo weiter oben in der Aufrufliste (bei IB).

Laut der docs ...

Den CALayer Referenz scheint zu diktieren, genau das, was ich mache, aber es stürzt jedes mal:

In iOS, wenn der layer ist im Zusammenhang mit einer UIView-Objekt diese Eigenschaft muss festgelegt werden, zu der Ansicht, dass der Eigentümer der Schicht.

Aber natürlich bin ich die Verschraubung etwas nach oben. Zum Glück, es ist leicht reproduzierbar. Können Sie mir erklären, wie ich mit sollte Unterebenen mit Delegiertenzuweisungen zu erhalten, das Recht drawLayer:inContext: Anrufe, ohne abzustürzen?

Schritte zum reproduzieren

Stellen diese in der Klasse der benutzerdefinierten Ansicht setzen Sie auf dem Bildschirm mit der Interface Builder (oder schreiben Sie die init aufgerufen werden initWithFrame:):

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];

    if (self) {
        CALayer *sublayer = [CALayer layer];
        sublayer.frame = self.layer.bounds;

        //Disable or enable this next line to 
        //resolve or trigger an EXC_BAD_ACCESS crash.
        //
        sublayer.delegate = self;

        [self.layer addSublayer:sublayer];
        [self.layer setNeedsDisplay];
    }

    return self;
}

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
    CGContextSetFillColorWithColor(ctx, [[UIColor greenColor] CGColor]);
    CGContextFillRect(ctx, self.bounds);
}

Wenn Sie diesen code ausführen, wird Ihre app zum Absturz. Geist der sublayer.delegate = self Linie. Wenn Sie Sie deaktivieren, dass man Ihre app ausgeführt wird, aber die drawLayer:inContext: - Methode wird nie aufgerufen, die Unterschicht.

Was mache ich falsch?

InformationsquelleAutor epologee | 2012-02-21
Schreibe einen Kommentar