Question

J'ai une application Cocoa avec ARC activé.J'utilise OS 10.8 et Xcode 4.4.L'application plante sporadiquement lors d'appels à CGLayerRelease, envoyant des messages comme les suivants dans la console :

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

Si je commente les appels à CGLayerRelease, le crash s'arrête.Dois-je appeler CGLayerRelease dans les projets compatibles ARC ?La documentation n'est pas très claire à ce sujet.

Il est difficile de publier du code pour cela car il est réparti dans un gros fichier pour une classe qui hérite de NSView.La classe a un membre de données CGLayerRef layer;.Puis dans la fonction drawRect :

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

La classe est également déléguée de sa fenêtre et a la fonction suivante

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

Également à l'intérieur d'un setter de propriété

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

Maintenant, si je décommente les appels à CGLayerRelease alors j'obtiens sporadiquement le crash mentionné ci-dessus.J'insiste « sporadiquement » car cela n'arrive pas toujours.

Était-ce utile?

La solution

Oui, vous devez appeler CGLayerRelease() dans ARC.Les affectations ci-dessus semblent correctes, mais je suppose que vous en avez peut-être d'autres.Vous accédez directement à vos ivars, ce qui est la cause n°1 de ce type de crash.N'accédez pas à vos propres ivars sauf dans init et dealloc.Créer un accesseur pour setLayer: qui libère correctement l'ancien et en crée un nouveau et l'utilise toujours.

Il est très possible que votre code CGLayer soit correct et que ce soit autre chose, comme un CGPath, que vous ajoutez au CGLayer.Déplacez tous vos ivars vers les accesseurs.Sinon, vous poursuivrez ce genre de bugs pour toujours.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top