1

高速列挙で引数を解放しますか? したがって、このコードは正確でしょうか:

    for (MKCircle *circle in localOverlays) {

    [mapView addOverlay: circle];

    [circle release]; // Is it perfectly alright to call this?
}

高速列挙を初めて使用するのは不思議です。

4

3 に答える 3

6

答えはApple Memory Management Rulesにあります。

  • あなたが作成したオブジェクトはあなたが所有します

    名前が「alloc」、「new」、「copy」、または「mutableCopy」で始まるメソッドを使用してオブジェクトを作成する</p>

作成しましたcircleか? いいえ。

保持を使用してオブジェクトの所有権を取得できます

維持しましたcircleか?いいえ。

したがって、あなたはオブジェクトを所有していません。

自分が所有していないオブジェクトの所有権を放棄してはなりません

を所有していないと判断したので、これはかなり簡単に思えますcircle。あなたの質問のコード例のリリースはそこにあるべきではありません。実際、ほとんどの場合、どこかでクラッシュが発生する可能性があります。

于 2012-06-06T09:52:34.563 に答える
1

通常、高速列挙は新しいオブジェクトを作成せず、既存のオブジェクトを通過します。NSArray通常のコンテナー ( 、NSSet、 )の高速な列挙は、NSDictionaryオブジェクトをループで使用できるようにする前にオブジェクトを保持しないため、オブジェクトを解放するとエラーになります。メソッド内であってdeallocも、そうすべきではありません。コンテナを解放すると、そのアイテムも解放されるため、個別に解放するべきではありません。

于 2012-06-06T09:25:55.103 に答える
1

いいえ、それは正しいことではないと思います。インスタンスに対してaretainも aも実行しませんrelease

for (MKCircle *circle in localOverlays) {

    [mapView addOverlay: circle]; //retain here
}

addOverley: を保持する必要があり、mapView がそれを必要としない場合はcirclemapView の責任ですrelease

簡単なガイド、あなたretain、そしてreleaseそれを使い終わったらそれ

于 2012-06-06T09:31:29.977 に答える