J'ai rencontré un problème iOS intéressant impliquant un CATiledLayer. Cela s'est seulement produit sur l'appareil - pas dans le simulateur.CATiledLayer drawInContext appelé après la vue associée est parti
Ma vue dessine son CALayer via drawLayer: inContext: délégué de rappel. Cette couche possède une sous-couche dérivée de CATiledLayer, qui effectue son propre dessin dans une méthode drawInContext: substituée.
Les deux couches rendent le contenu PDF via CGContextDrawPDFPage(). (Le CALayer dessine une version basse résolution, tandis que la sous-couche CATiledLayer dessine un contenu haute résolution par dessus.)
J'ai rencontré un scénario dans lequel j'aurais fini avec la vue - je l'enlèverais de sa vue d'ensemble et la lâcherais. . dealloc() est appelé sur la vue. Quelque temps plus tard, la méthode drawInContext: de CATiledLayer serait appelée (sur un thread d'arrière-plan), par le système. Cela dessinerait, mais au retour de la méthode, Springboard tomberait en panne et, ce faisant, ferait tomber mon application.
Je l'ai corrigé en définissant un drapeau dans le CATiledLayer, en lui disant de ne plus rendre, à partir de la méthode dealloc de la vue.
Mais je peux seulement imaginer qu'il y a une manière plus élégante. Comment se fait-il que la méthode CATiledLayer drawInContext: soit encore appelée après la couche parente, et que la vue de la couche parente ait été désallouée? Quelle est la bonne façon de fermer la vue afin que cela n'arrive pas?
Cela a fonctionné excellent pour moi, simple et efficace. –
Si la vue est déjà désallouée, comment self.superview (un accès à self, un objet désalloué) peut-il fonctionner? –