Pertanyaan Bagaimana saya bisa menyelesaikan Dihentikan karena Kesalahan Memori


Saya menggunakan MKMapView dalam proyek besar saya. ketika saya memuat banyak anotasi (lebih dari 700) dan saya menggambar garis di antara titik-titik tersebut di MapKit, saya mendapatkan pesan kesalahan xcode "Dihentikan karena kesalahan memori" dan aplikasi mogok. Anda dapat melihat pada gambar:

enter image description here.

Saya menambahkan baris seperti ini:

enter image description here

jika saya memiliki kurang dari 700 anotasi, itu bekerja dengan sangat baik. Saya berpikir itu memiliki masalah ingatan. Bagaimana saya bisa mengatasi masalah ini? Saran apa pun.

    // 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 file punya

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

Metode Delegasi 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;

}

6
2017-10-20 20:20


asal


Jawaban:


Baru-baru ini - dan dengan frekuensi yang meningkat - Saya telah melihat pesan kesalahan yang sama ("Dihentikan karena Kesalahan Memori") setiap kali saya menjalankan proyek dari Xcode, setelah hampir satu menit waktu proses, bahkan jika saya tidak menyentuh aplikasi setelah dimulai.

Saya tidak melihat:

  • Setiap konsumsi memori yang mengejutkan ketika dijalankan dengan profiler.
  • Setiap pola yang jelas ketika aplikasi dihentikan (selain dari lamanya waktu yang dibutuhkan untuk terjadi, tetapi butuh waktu untuk mengenali).
  • Pesan "Pengakhiran aplikasi karena pengecualian tidak tertangkap", atau jejak tumpukan di konsol.
  • Pengecualian apa pun yang dibuang (kecuali breakpoint; pengecualian: semua; break: on throw).
  • Setiap benda zombie.

Juga, saya punya hanya melihat aplikasi ada secara tidak terduga ketika aplikasi dijalankan dalam debug - tidak secara acak melompat kembali ke Springboard jika saya menjalankan ulang aplikasi dari perangkat langsung setelah dihentikan.

Saya akan mengajukan pertanyaan serupa, merinci semua hal spesifik ini dan bertanya bagaimana saya bisa menyelesaikan masalah ini.

Kemudian saya memiliki momen d'oh, dan memperhatikan dua peringatan memori di konsol, meskipun profiler tidak menunjukkan masalah memori.

Zombie. Ketika saya mematikan Objek Zombie, peringatan memori menghilang, dan aplikasi tidak lagi diakhiri secara spontan.

Edit:

10 bulan kemudian, saya menemukan situasi lain di mana ini bisa terjadi. Ternyata, tak terbatas while loop juga bisa melakukan ini:

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"
}

5
2018-05-13 13:19