Clayrelease crash
-
13-12-2019 - |
Domanda
Ho un'app di cacao con ARC abilitato.Sto usando OS 10.8 e XCode 4.4.L'app sporadicamente si blocca sulle chiamate a CGLyRelease, dumping messaggi come la seguente console:
error for object 0x10a2d2000: entry for pointer being freed from death-row vanished
.
Se commento le chiamate a CGLYRYRelease le fermate di schianamento.Devo chiamare clicayrelease in Arc Abilitato progetti?La documentazione non è molto chiara su questo.
È difficile postare il codice per questo perché è diffuso durante un file di grandi dimensioni per una classe che eredita da nsview.La classe ha un membro dei dati CGLayerRef layer;
.Quindi all'interno della funzione DreanRect:
if (layer == nil) {
layer = CGLayerCreateWithContext(context, self.frame.size, NULL);
// draw some stuff into CGLayerGetContext(layer)
}
CGContextDrawLayerInRect(context, self.bounds, layer);
.
La classe è anche un delegato della sua finestra e ha la seguente funzione
- (void)windowDidEndLiveResize:(NSNotification *)notification {
if (layer) {
//CGLayerRelease(layer);
layer = nil;
}
[self setNeedsDisplay:YES];
}
.
Anche all'interno di un setter di proprietà
- (void)setPitch:(NSArray *)aPitch {
pitch = aPitch;
if (layer) {
//CGLayerRelease(layer);
layer = nil;
}
}
.
Ora se non compromevo le chiamate a CGLayerRelease
, quindi ho sporadicamente il crollo sopra menzionato.Sottolineo "sporadicamente" perché non succede sempre.
Soluzione
Sì, è necessario chiamare CGLyRelease () in Arc.Gli incarichi di cui sopra sembrano corretti, ma sospetto che tu possa avere altri.Stai accedendo direttamente ai tuoi Ivars, che è la causa n. 1 di questi tipi di incidenti.Non accedere ai tuoi Ivars tranne che in init e dealloc.Creare un accessor per setLayer:
che rilascia correttamente il vecchio e crea uno nuovo e lo usa sempre.
È molto possibile che il tuo codice CGLAYER stia bene, e che è qualcos'altro come un cgpath che stai aggiungendo al clayer.Sposta tutti i tuoi IVAR per gli accessori.Altrimenti inseguerai questi tipi di bug per sempre.