今日、CATiledLayer に関する興味深い iOS の問題に遭遇しました。これはデバイス上でのみ発生し、シミュレーターでは発生しませんでした。
私のビューは、drawLayer: inContext: デリゲート コールバックを介してその CALayer を描画します。このレイヤーには CATiledLayer から派生したサブレイヤーがあり、オーバーライドされた drawInContext: メソッドで独自の描画を行います。
どちらのレイヤーも、CGContextDrawPDFPage() を介して pdf コンテンツをレンダリングしています。(CALayer は低解像度バージョンを描画し、CATiledLayer サブレイヤーはその上に高解像度コンテンツを描画します。)
私はビューを使い果たし、スーパービューからビューを削除して解放するというシナリオに遭遇しました。ビューで dealloc() が呼び出されます。しばらくして、CATiledLayer の drawInContext: メソッドがシステムによって (バックグラウンド スレッドで) 呼び出されます。それは描画しますが、Springboard メソッドから戻るとクラッシュし、その際にアプリもダウンします。
ビューの dealloc メソッドから、CATiledLayer にフラグを設定して、これ以上レンダリングしないように指示することで修正しました。
しかし、もっとエレガントな方法があるとしか想像できません。CATiledLayer drawInContext: メソッドがまだ親レイヤーの後に呼び出され、親レイヤーのビューの割り当てが解除されたのはなぜですか? これが起こらないようにビューをシャットダウンする正しい方法は何ですか?