0

静的コード分析を利用して、コード内のメモリ管理の問題を見つけ始めています。非常に便利だと思いましたが、メモリリークを引き起こしていない(機器は何も報告していません)が、アナライザーによって報告されていると確信しているコードがいくつかあります。わかりにくい方法でコードを書くのは私の問題だと思います。これが例です

for (glyphUnit *ellipsisDot in ellipsisArray) {
    CGPathRef newDot = CGPathCreateCopyByTransformingPath(ellipsisDot.glyphPath, &ellipsisTransform);
    CGPathRelease(ellipsisDot.glyphPath);  // Incorrect decrement of the reference count of an object that is not owned at this point by the caller
    ellipsisDot.glyphPath = newDot;
}        

ここglyphUnitで、はプロパティとしての単純なカスタムクラスであり、カスタムクラスはそのメソッドGCPathRefでリリースします。deallocしたがって、このループでは、パスを変換して保存しnewDot、元のglyphPathを解放して、新しく作成したパスを割り当てることができるようにします。これがコードアナライザーを混乱させていることがわかります。所有していないオブジェクトをデクリメントしているというメッセージが表示されます。混乱することなく新しいパスを交換する別の方法はありますか?

4

2 に答える 2

3

そのはず、

for (glyphUnit *ellipsisDot in ellipsisArray) {
    CGPathRef newDot = CGPathCreateCopyByTransformingPath(ellipsisDot.glyphPath, &ellipsisTransform);
    ellipsisDot.glyphPath = newDot;
    CGPathRelease(newDot); 
} 

CG CreateCopy 操作を実行して作成newDotしており、その変数を解放する必要があります。そのため、アナライザーはellipsisDot.glyphPath、解放するパラメーターを所有していないことを警告しています。ここで間違ったパラメーターを解放しようとしています。問題のようにそのリリースステートメントを2行目に入れ、2つの別々のインスタンスを指している場合ellipsisDot.glyphPathnewDot3 行目でのみ、に割り当てnewDotていましたellipsisDot.glyphPath

于 2013-01-17T22:42:27.283 に答える
0

glyphUnitカスタムクラスでセッターを定義するのを忘れていたことがわかりました。オブジェクトの ARC の世界にいて、メソッドの合成に慣れていた私は、コアの基盤参照の保持カウントを管理する必要性を忘れていました。で glyphPath を解放していましたdeallocが、setter メソッドを使用していませんでした。@Svenが疑ったように、私は単に合成を使用し、assign上記のコードスニペットで直感的ではないリリースを行うことでセッターメソッドの欠如を補っていました。以下のようにセッターメソッドを追加しましたglyphUnit

- (void)setGlyphPath:(CGPathRef)newPath
{
    if (_glyphPath != newPath)
    {
        CGPathRelease(_glyphPath);
        _glyphPath = CGPathRetain(newPath);
    }
}

これを追加した後、コード スニペットを @ACB で説明されているものに変更するために必要な保持が行われ、コードが正常に実行されました (それがないと、明らかに EXC_BAD_ACCESS が発生しました)。

私の間違いを推測し、正しい方向に私を設定してくれた@Svenへの称賛...しゃれは意図されていません。

于 2013-01-18T22:57:05.087 に答える