6

大きなプロジェクトで MKMapView を使用しています。多くの注釈 (700 以上) をロードし、MapKit のそれらのポイント間に線を引くと、xcode エラー メッセージ "Terminated due to memory error" が表示され、アプリがクラッシュします。画像で見ることができます:

ここに画像の説明を入力.

私はこのような行を追加しています:

ここに画像の説明を入力

注釈が 700 未満の場合、非常にうまく機能しています。メモリに問題があると思います。どうすればこの問題を解決できますか?何かアドバイスがあれば教えてください。

    // adding annodation 
    for (int i=0; i<[fetcher.locations count]; i++)//fetcher.locations is NSMutableArray and inside have  locationInfoClass objects .  locationInfoClass is hold CLLocationCoordinate2D.
        {
           locationInfoClass * loc=[fetcher2.locations objectAtIndex:i];

            CLLocationCoordinate2D coordinate1;
            coordinate1.latitude = loc.lat;
            coordinate1.longitude = loc.lon;

            myAnnotation * ann = [[myAnnotation alloc] initWithCoordinate:annCoordinate           title:@"uniqtitle" subtitle:@"uniqsubtitle"];
           [mapView addAnnotation:ann];


        }
        #pragma mark -
        #pragma mark -mapview overlay 


        CLLocationCoordinate2D *coordinates
        = malloc(sizeof(CLLocationCoordinate2D) * [mapView.annotations count]);

        for (int i=0; i<[mapView.annotations count]; i++) {
            myAnnotation * ann=[mapView.annotations objectAtIndex:i];
            coordinates[i]=ann.coordinate;


        }


        self.routeLine = [MKPolyline polylineWithCoordinates:coordinates count:mapView.annotations.count]; // pinlerin sayısı ne kadarsa o kadar çizgi çiziyor.
        free(coordinates);
        [self.mapView setVisibleMapRect:[self.routeLine boundingMapRect]]; //If you want the route to be visible
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.mapView addOverlay:self.routeLine];
        });

.h ファイルには

@property (nonatomic, retain) MKPolyline *routeLine; //your line
@property (nonatomic, retain) MKPolylineView *routeLineView; //overlay view 

MKMapView デリゲート メソッド 。

-(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay
{
    if(overlay == self.routeLine)
    {
        if(nil == self.routeLineView)
        {
            self.routeLineView = [[MKPolylineView alloc] initWithPolyline:self.routeLine];
            self.routeLineView.fillColor = [UIColor redColor];
            self.routeLineView.strokeColor = [UIColor redColor];
            self.routeLineView.lineWidth = 3;

        }

        return self.routeLineView;
    }

    return nil;
}
/*
- (void)mapView:(MKMapView *)mv didAddAnnotationViews:(NSArray *)views
{
    MKAnnotationView *annotationView = [views objectAtIndex:0];
    id <MKAnnotation> mp = [annotationView annotation];
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance([mp coordinate], 1500, 1500);
    [mv setRegion:region animated:YES];

}*/
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{

    MKAnnotationView *pinView = nil;
    if(annotation != mapView.userLocation)
    {
        static NSString *defaultPinID = @"ftffggf";
        pinView = (MKAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID];
        if ( pinView == nil )
            pinView = [[MKAnnotationView alloc]
                       initWithAnnotation:annotation reuseIdentifier:defaultPinID];

        //pinView.pinColor = MKPinAnnotationColorGreen;
        pinView.canShowCallout = YES;



        //pinView.animatesDrop = YES;
        UIImage * image=[UIImage imageNamed:@"pin.png"];
        CGSize size=CGSizeMake(50, 63);//set the width and height
        pinView.image = image
    }
    else {
        [self.mapView.userLocation setTitle:@"I am here"];
    }
    pinView.centerOffset = CGPointMake(0,-23);
    return pinView;

}
4

1 に答える 1

5

最近、頻繁に、XCode からプロジェクトを実行するたびに、アプリに触れていなくても、ほぼ正確に 1 分間実行した後、同じエラー メッセージ ("Terminated due to Memory Error") が表示されます。それが始まった後。

私は見ていませんでした:

  • プロファイラーで実行したときの驚くべきメモリ消費。
  • アプリが終了するときの明らかなパターン (発生するまでにかかった時間の長さを除くが、それを認識するのに時間がかかりました)。
  • 「キャッチされていない例外によるアプリの終了」エラー メッセージ、またはコンソールのスタック トレース。
  • スローされるすべての例外 (例外ブレークポイント; 例外: すべて; ブレーク: スロー時)。
  • ゾンビ オブジェクト。

また、アプリがデバッグで実行されているときに、アプリが予期せず存在するのを見ただけです。終了した直後にデバイスからアプリを再実行しても、Springboard にランダムに戻ることはありません。

私は同様の質問をしようとしていました.これらすべての詳細を詳述し、一体どうすれば問題を解決できるかを尋ねました.

その後、ちょっと考えて、プロファイラーにはメモリの問題が表示されなかったにもかかわらず、コンソールに 2 つのメモリ警告が表示されていることに気付きました。

ゾンビ。Zombie Objects をオフにすると、メモリ警告が消え、アプリが自然終了しなくなりました。

編集:

10 か月後、これが起こり得る別の状況を発見しました。結局のところ、無限whileループでもこれを行うことができます:

while (result==nil) {
    result = [collectionView indexPathForItemAtPoint:testPoint];
    testPoint = nextTestPoint(); // After about 12 seconds, at which point this is several tens of thousands of pixels off the edge of the screen, the app dies from "Memory error"
}
于 2014-05-13T13:19:14.677 に答える