2012-01-18 8 views
1

私は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]; 
} 
+0

あなたがそれらを「失う」の前に、あなたの配列や辞書をクリアしようとしたことがありますか?あなたのコードは一目瞭然です。 – jv42

+0

意味的に同等であるにもかかわらず、強力に交換されていますが、引き続き機器に漏れがありますか?それはARCコードではありません、deallocで両方のivarsを解放しますか? –

+0

私は強く/保持の交換をしようとします。はい、ivarsはdeallocでリリースされますが、コントローラオブジェクトは死ぬことはないので、呼び出されることはありません。 – chadbag

答えて

0

インスツルメントでは、リークしたオブジェクトがどこに割り当てられているかを示していますが、リークが発生している場所は示されていません。つまり、尖った行に割り当てられたオブジェクトがコード内のどこかにリークを引き起こす可能性があります。

これはしかし、あなたのコードの場合があり得るかどうかは知りません。

+0

はい。私の場合、これらのオブジェクトのいずれかが処分される場所は他にありません。彼らはこのクラスのどこか他の場所から読むだけです(彼らが参照されている唯一の場所です)。私はこれが誤った警告であると考え始めています。 FYIとして、静的分析ではこのコードに問題はありません。 – chadbag

+0

すべての出力を消去して再構築した後でコードをプロファイリングしていますよね? – aslisabanci

+0

はい私はそれをやっています。 – chadbag

関連する問題