Cglemayerelease choques
-
13-12-2019 - |
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.
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.