2

Apple のメモリ管理標準を理解しようとして、奇妙な問題に遭遇しました。ユーザーにコピーであることを知らせずにコピーを返すメソッドがあるとします。

+(Point2D*) Add:(Point2D*)a To:(Point2D*)b
{
        Point2D * newPoint = [a copy];
        [newPoint Add:b]; // Actually perform the arithmetic.
        return [newPoint autorelease];
}

問題は、Xcode の Analyze 関数が、送信されたオブジェクトとしてフラグを立て、 -autorelease 呼び出しが多すぎることです。これは、 -copy が暗黙的に所有権を取得していると想定しているためであり、保持カウントが +0 になる可能性が高いためだと思います。しかし、私は完全にはわかりません。

Xcodeの分析情報

+(Point2D*) Add:(Point2D*)a To:(Point2D*)b
{
        Point2D * newPoint = [a copy]; // <- 1. Method returns an Objective-C object with a +0 retain count.
        [newPoint Add:b];
        return [newPoint autorelease]; // <- 2. Object sent -autorelease method.
                                       // <- 3. Object returned to caller with a +0 retain count.
                                       // <- 4. Object over -autoreleased: object was sent -autorelease but the object has zero (locally visible) retain counts.
}

なぜこれが起こっているのかについてのヒントやヒントはありますか? 私が何かを見逃していない限り、自動解放は安全な時間までトリガーされないため、コードは正常に機能するはずです (つまり、便利なコンストラクターのように機能し、ユーザーは保持する時間があります)。

リクエストに応じて、 -copyWithZone: は次のように実装されます。

-(id)copyWithZone:(NSZone *)zone
{
        return [[Point2D allocWithZone:zone] initX:x Y:y Z:z];
}
4

1 に答える 1

0

クラスに正しく実装-copyWithZone:(NSZone*)zoneしますPoint(または、少なくともここにコピーしてください)

于 2012-06-24T06:57:13.303 に答える