2011-06-17 12 views
3

iPhoneのメモリ警告に関する問題があります。私はオーバーレイを削除し、新しいものを挿入します。これは5秒ごとに発生します。しかし、しばらくすると、半分の時間のように、私はメモリの警告を取得し、私のアプリケーションがクラッシュします。MapKitでオーバーレイビューを使用してメモリ警告レベル2を取得する

私のオーバーレイのサブビューが問題です...
三角形は "drawRect"で作成されます。
私はそれをテストしましたが、三角形は問題なく、アプリケーションは安定しています。

ただし、三角形をcircleViewに追加した場合のみです。

三角形クラスが空の場合、同じ問題があります。

- (MKOverlayView *)mapView:(MKMapView *)map viewForOverlay:(id <MKOverlay>)overlay 
{  
    MKOverlayView *overlayReturn = nil; 

    if ([overlay isKindOfClass:[MKCircle class]] == YES) { 
    MKCircleView *circleView = [[[MKCircleView alloc] initWithOverlay:overlay]autorelease] ; 

    circleView.strokeColor = [UIColor redColor]; 
    circleView.lineWidth = 1; 
    circleView.fillColor = [[UIColor redColor] colorWithAlphaComponent:0.4]; 

    Triangle* triangle = [[Triangle alloc]initWithFrame:CGRectMake(circleView.circle.radius*10-1000, circleView.circle.radius*10-1000, 2000, 2000)]; 

    triangle.backgroundColor = [UIColor clearColor]; 
    [circleView addSubview:triangle]; 
    [triangle release]; 

    return circleView; 
} 

答えて

0

あなたは、できるだけ早くすることができますようにこれらのオブジェクトを解放するために別のNSAutoreleasepoolを設定することができれば、私は、あなたが(ループ内で、または何)、そのメソッドを使用しているかわからないんだけど、。

は、ここでは、できるだけ早く自動解放オブジェクトを取り除くためにループでそれを使うことができる方法の例です。

for (NSInteger i = 0; i < 99999999999999; i++) 
{ 
    NSAutoreleasePool *innerPool = [[NSAutoreleasePool alloc] init]; 
    NSString *string = [NSString string]; 
    // code 
    [innerPool release]; 
} 
1

メモリの占有量を確認するには、計測器のリークとアロケーションを開始してください。私が推測しなければならないと、あなたはおそらくTriangleクラスの中に何かを漏らしているでしょう。

+0

はありません..それでもインストゥルメントのリークや割り当てを開始し、同じ問題 – Simon

+0

があります。これはどのような種類のオブジェクトがメモリを消費しているかを示します。 –

+0

リークはありません – Simon

1

私はほとんど同じ問題を抱えています。ちょうどキットが複数のオーバーレイをうまく扱っていないようです。それがMKCircle、MKPolygon、またはカスタムであるかどうかは関係ありません。

問題はviewForOverlayがオーバーレイを再利用していないことです。したがって、毎回新しいオーバーレイと三角形を作成します。

この質問の回答には、回避策があります。しかし、アップルのデベロッパーフォーラムにあります:here ...

これで、すべてのオーバーレイが1つ作成されます。メモリ使用量がはるかに少なくなりました。クラスが空の場合

+0

複数のオーバーレイは問題ありません。あなたが言及している再利用の欠点は問題です。 –

+0

実際、複数のオーバーレイは問題ありません。しかし、それらを再利用しないと問題が発生します。各オーバーレイはマップ上に新しいレイヤーとして作成されます。したがって、非常にメモリが重い...回避策では、すべてのオーバーレイから1つのオーバーレイが作成されるため、1つしか使用しないため、再利用する必要はありません。 – wkberg

+0

はい、私は同意します...再利用するので –

関連する問題