3

iPhone のメモリ警告に関する問題があります。オーバーレイを削除し、新しいオーバーレイを挿入します。これは 5 秒ごとに発生します。しかし、30 分ほどすると、メモリ警告が表示され、アプリがクラッシュします。

オーバーレイのサブビューが問題です...
三角形は「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;
}
4

3 に答える 3

1

Instrument の Leaks and Allocations から始めて、メモリを占有しているものを確認します。Triangle私が推測しなければならなかった場合、おそらくクラス内で何かをリークしています。

于 2011-06-17T16:36:10.047 に答える
1

私はほとんど同じ問題を抱えていました。キットが複数のオーバーレイをうまく処理していないようです。MKCircle、MKPolygon、カスタムのいずれであっても問題ありません...

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

この質問への回答に記載されている回避策があります。ただし、Apple Developer フォーラムにはあります。ここで入手してください...

このようにして、すべてのオーバーレイを含む 1 つのオーバーレイを作成します。その結果、メモリ使用量がはるかに少なくなります。

于 2013-07-05T20:35:34.920 に答える
0

そのメソッドをどのように (ループで、または何を) 使用しているかはわかりませんが、可能であれば、別の NSAutoreleasepool をセットアップして、それらのオブジェクトをできるだけ早く解放してください。

これをループで使用して、自動解放されたオブジェクトをできるだけ早く取り除く方法の例を次に示します。

for (NSInteger i = 0; i < 99999999999999; i++ )
{
    NSAutoreleasePool *innerPool = [[NSAutoreleasePool alloc] init];
    NSString *string = [NSString string];
    // code
    [innerPool release];
}
于 2011-06-17T16:32:23.083 に答える