Frage

Ich habe eine Kakao-App mit aktiviertem ARC.Ich benutze OS 10.8 und Xcode 4.4.Die App stürzt sporadisch bei Aufrufen von CGLayerRelease ab und gibt Nachrichten wie die folgenden an die Konsole aus:

error for object 0x10a2d2000: entry for pointer being freed from death-row vanished

Wenn ich die Aufrufe von CGLayerRelease auskommentiere, stoppt der Absturz.Muss ich CGLayerRelease in ARC-fähigen Projekten aufrufen?Die Dokumentation ist diesbezüglich nicht sehr klar.

Es ist schwierig, Code dafür zu posten, da er in einer großen Datei für eine Klasse verteilt ist, die von NSView erbt.Die Klasse hat ein Datenelement CGLayerRef layer;.Dann innerhalb der drawRect-Funktion:

    if (layer == nil) {
        layer = CGLayerCreateWithContext(context, self.frame.size, NULL);
        // draw some stuff into CGLayerGetContext(layer)
    }
    CGContextDrawLayerInRect(context, self.bounds, layer);

Die Klasse ist auch ein Delegat ihres Fensters und hat die folgende Funktion

- (void)windowDidEndLiveResize:(NSNotification *)notification {
    if (layer) {
        //CGLayerRelease(layer);
        layer = nil;
    }
    [self setNeedsDisplay:YES];
}

Auch in einem Property Setter

- (void)setPitch:(NSArray *)aPitch {
    pitch = aPitch;
    if (layer) {
        //CGLayerRelease(layer);
        layer = nil;
    }
}

Nun, wenn ich die Anrufe auskommentiere an CGLayerRelease dann bekomme ich sporadisch den oben erwähnten Absturz.Ich betone "sporadisch", weil es nicht immer passiert.

War es hilfreich?

Lösung

Ja, Sie müssen CGLayerRelease () in ARC aufrufen.Die obigen Zuweisungen sehen korrekt aus, aber ich vermute, dass Sie möglicherweise andere haben.Sie greifen direkt auf Ihre Ivars zu, was die # 1-Ursache für diese Art von Abstürzen ist.Greifen Sie nicht auf Ihre eigenen ivars zu, außer in init und dealloc .Erstellen Sie einen Accessor für setLayer: das gibt das alte korrekt frei und erstellt ein neues und verwendet das immer.

Es ist sehr wahrscheinlich, dass Ihr CGLayer-Code in Ordnung ist und dass es sich um etwas anderes wie einen CGPath handelt, den Sie dem CGLayer hinzufügen.Verschieben Sie alle Ihre Ivars zu Accessoren.Andernfalls werden Sie diese Art von Fehlern für immer verfolgen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top