0

ARCが有効になっているCocoaアプリがあります。OS10.8とXcode4.4を使用しています。CGLayerReleaseを呼び出すとアプリが散発的にクラッシュし、次のようなメッセージがコンソールにダンプされます。

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

CGLayerReleaseの呼び出しをコメントアウトすると、クラッシュが停止します。ARC対応プロジェクトでCGLayerReleaseを呼び出す必要がありますか?ドキュメントはこれについてあまり明確ではありません。

NSViewから継承するクラスの大きなファイル全体に分散しているため、このコードを投稿するのは困難です。クラスにはデータメンバーがありCGLayerRef layer;ます。次に、drawRect関数内で:

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

このクラスはウィンドウのデリゲートでもあり、次の機能があります

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

プロパティセッター内にも

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

ここで、への呼び出しのコメントを解除すると、CGLayerRelease上記のクラッシュが散発的に発生します。いつも起こるとは限らないので、私は「散発的に」強調します。

4

1 に答える 1

0

はい、ARCでCGLayerRelease()を呼び出す必要があります。上記の割り当ては正しいように見えますが、他の割り当てがあるのではないかと思います。ivarに直接アクセスしているため、この種のクラッシュの最大の原因となっています。initとdeallocを除いて、独自のivarにアクセスしないでください。そのためのアクセサーを作成するsetLayer:と、古いアクセサーが正しく解放され、新しいアクセサーが作成され、常にそれが使用されます。

CGLayerコードが正常であり、CGLayerに追加しているCGPathのようなものである可能性が非常に高くなります。すべてのivarをアクセサに移動します。そうでなければ、あなたはこれらの種類のバグを永遠に追いかけるでしょう。

于 2012-07-31T00:10:38.197 に答える