Pregunta

Tengo una aplicación de cacao con Arco habilitado.Estoy usando OS 10.8 y Xcode 4.4.La aplicación se bloquea esporádicamente a las llamadas a CGLAYERRELEASE, dumping mensajes como la siguiente a la consola:

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

Si comento las llamadas a CGLAYERRELEASE, las paradas de bloqueo.¿Necesito llamar a CGLAYERRELEASE en proyectos habilitados para ARC?La documentación no es muy clara sobre esto.

Es difícil publicar el código para esto porque se extiende a lo largo de un archivo grande para una clase que hereda de NSVIEW.La clase tiene un miembro de datos generacodiCodeGode.Luego, dentro de la función Drawrect:

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

La clase también es un delegado de su ventana y tiene la siguiente función

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

también dentro de un setter de propiedad

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

Ahora si descongo las llamadas a CGLayerRef layer;, entonces esporádicamente me mencioné el bloqueo mencionado anteriormente.Destaca "esporádicamente" porque no siempre sucede.

¿Fue útil?

Solución

Sí, debe llamar a CGLAYERRELEASE () en ARC.Las tareas anteriores se ven correctas, pero sospecho que puede tener otras.Usted está accediendo directamente a sus IVARS, que es la causa número 1 de este tipo de choques.No acceda a sus propios IVARS, excepto en Init and DealloC.Cree un accesorio para setLayer: que libere correctamente el anterior y crea uno nuevo y siempre use eso.

Es muy posible que su código de CGAYER esté bien, y que sea otra cosa como un CGPATH que está agregando al CGAYER.Mueve todos tus IVARS a los accesorios.De lo contrario, estará persiguiendo este tipo de errores para siempre.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top