0

OSX のようなテキストの強調表示効果 (黄色のアニメーション化されたバウンス ボックス) を提供するScintilla コンポーネントの最近の機能を使用しようとしていますが、断続的にポップアップするエラーに悩まされています。

EXC_BAD_ACCESS

この特定の行を指している:

if (layerFindIndicator!=nil)
        if ([layerFindIndicator animationForKey:@"animateFound"])
            [layerFindIndicator removeAnimationForKey:@"animateFound"];

ifs は私のものです。オブジェクトlayerFindIndicatorが nil であるか、割り当てが解除されているかなどを見つけた場合に備えて...残念ながら、それは役に立ちません...)

layerFindIndicatorのサブクラスのようですCAGradientLayer。( の完全なコードはlayerFindIndicatorここで確認できます)。

私はQuartz Coreのまったくの初心者なので、これをどのようにデバッグできるかについてのヒントを教えてください。

4

2 に答える 2

5

私は Quartz Core のまったくの初心者なので、これをデバッグする方法についてヒントを教えてください。

これは具体的に QuartzCore とは何の関係もありません (少なくとも、そうでないことを願っています) — それは一般的なものです。 .

Xcode の場合:

  1. 現在のスキームを編集します。
  2. プロファイル アクションの場合は、デバッグ ビルド構成を使用するように設定します。
  3. それを却下してから、プロファイルコマンドを押してください。

Xcode はそのアクションのためにビルドし、Instruments を起動します。

楽器は、テンプレートを選択するように求めます。ゾンビのテンプレートが必要です。選択すると、Instruments がトレース ドキュメントを作成し、アプリケーションを実行します。アプリケーションに切り替えて (まだ最前面にない場合)、クラッシュの原因となるすべてのことを行います。

クラッシュが本当に死んだオブジェクトのクラッシュである場合、ゾンビはそれを明らかにします。Instruments のタイムラインに「ゾンビ オブジェクト 0xd3c2b1a0 にメッセージが送信されました」などのフラグが表示され、その後すぐにプログラムが終了する可能性があります。

そのフラグには、次のような小さなボタンがあります: ➲ 灰色になることを除いて。クリックして。

これにより、そのオブジェクトの履歴(実際には、そのアドレスで開始された以前のオブジェクトやその他の割り当てを含む、そのアドレスの履歴) に移動します。拡張詳細ペイン (スタック トレースを示す右側に表示されるペイン) を表示し、最後までスクロールしてから、リリースと自動リリースを見て、時間をかけて段階的に後方 (上方) に移動します。オブジェクトの割り当てまたは保持のバランスをとっていません。

ソリューションには、おそらく次の 1 つ以上が含まれます。

  • プロパティを/ではなくstrongorに変更するweakassignunsafe_unretained
  • 以前にオブジェクトを強く所有していなかったプロパティを追加する
  • 上記のどれを行う必要があるかが明確でない場合、またはそれらのいずれかが不潔なハックのように思われる場合は、いくつかのことを再設計します
  • ARC に切り替えて、weakプロパティと__weakインスタンス変数 (どちらもnil参照されたオブジェクトが終了すると自動的に設定されます) を取得し、暗黙的に初期化されるローカル変数を取得します。nil

ただし、Instruments で何を見つけるかによって異なります。そしてもちろん、あなたの問題 (アクセスの悪さ) が死んだオブジェクトではなく、上記のすべてが役に立たない可能性もあります。

于 2012-04-22T18:31:31.600 に答える
-1

これを試して:

if (layerFindIndicator!=nil){
    if ([layerFindIndicator animationForKey:@"animateFound"]){
        [layerFindIndicator removeAnimationForKey:@"animateFound"];
    }
}

また、リリースされているかどうかも確認してください。

編集:

私が見つけたもう1つのことは、ifに空白がなかったことです。コードは次のようになります。

if (layerFindIndicator != nil){
    if ([layerFindIndicator animationForKey:@"animateFound"]){
        [layerFindIndicator removeAnimationForKey:@"animateFound"];
    }  
}
于 2012-04-22T15:33:25.280 に答える