私はMKMapViewにMKAnnotationsを追跡するために、次の簡単なコードを持っています。私は、私が追跡したいと思う位置のリストを通してループ内に注釈を作成する。私は、プロパティ(; ARCとの将来の互換性のためにARCを使用しますがそう「強い」の代わりに、彼らはおそらく同義であるため、保持を使用してのXcode 4.2を使用していない)宣言されている私のコレクションクラス、NSMutableDictionaryとNSMutableArrayの、に注釈を追加します。のiOS:Xcodeの4.2:インストゥルメントは、私は私のNSMutableArrayのとNSMutableDictionaryとのリークを持っていると言うが、私は見ていないリークどこ
私はこのルーチン二回目(場所のリストが更新されたときに言う)を呼び出した場合、リークインストゥルメントは注釈が漏れていると主張しているだけでなく、コレクションオブジェクト自体を。 (私は、スタックトレースはNSMutableArrayの両方について、私たちだけでなく、注釈に一致小さな漏洩の数、及び苦情の辞書を作成し、私の財産に設定されている行を指すと私のリークリストに単一NSMUtableDictionaryを取得しますおよびNSMutableDictionary)。しかし、私はメモリ管理ルールに違反することはありません。私はalloc/initを使って注釈の作成とペアを組んでいます。私は自分のプロパティ "セッター"を介して暗黙的な保持を行い、コレクションが置き換えられると、それらは解放され、次にすべてのコンテンツオブジェクトを解放する必要があります。誰かが私が間違っている場所を見ることができれば、私はそれを感謝します。
@property(strong, nonatomic) NSMutableArray *annotationList;
@property(strong, nonatomic) NSMutableDictionary *annotationLocations;
。
-(void) createMapAnnotations
{
if ([[self mapView] annotations])
[[self mapView] removeAnnotations:[[self mapView] annotations]];
[self setAnnotationList:[NSMutableArray array]];
[self setAnnotationLocations:[NSMutableDictionary dictionary]];
for (JEstablishmentLocation *loc in [[JLocationManager sharedLocationManager] localLocations])
{
MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];
[annotation setCoordinate:[[loc estCoordinates] coordinate]];
[[self mapView] addAnnotation:annotation];
[[self annotationList] addObject:[NSDictionary dictionaryWithObject:annotation forKey:[loc estKeyValue]]];
[[self annotationLocations] setObject:loc forKey:[annotation description]];
[annotation release];
}
[self centerOnCurrentLocation];
}
あなたがそれらを「失う」の前に、あなたの配列や辞書をクリアしようとしたことがありますか?あなたのコードは一目瞭然です。 – jv42
意味的に同等であるにもかかわらず、強力に交換されていますが、引き続き機器に漏れがありますか?それはARCコードではありません、deallocで両方のivarsを解放しますか? –
私は強く/保持の交換をしようとします。はい、ivarsはdeallocでリリースされますが、コントローラオブジェクトは死ぬことはないので、呼び出されることはありません。 – chadbag