MKMapView und unregelmäßige Programm abstürze

C

CloudyofSky

Mitglied
Thread Starter
Dabei seit
04.05.2009
Beiträge
66
Reaktionspunkte
3
Hallo Zusammen,

ich arbeite in meiner App mit einem NavigationController, der mich durch die verschiedenen Views begleitet. Das 3. View beinhaltete ein MKMapView auf der ich mit den Stecknadeln ein paar Orte markiere. Mein Problem ist nun, wenn ich über eine Hinzufüge Schaltfläche ein neues View dem NaviController hinzufüge und später per "back" Schaltfläche auf die MKMapView zurück gehe, stürzt ca. bei jedem 2. oder 3. mal das Programm komplett, ohne Fehlermeldung ab. Nun habe ich im Internet den Hinweis gefunden, das ich das Delegate von mapView auf Nil setzen soll, wenn ich es nicht benötige, das habe ich beim laden des nächsten Views nun auch gemacht und beim zurück gehen wieder auf self gesetzt, jedoch das selbe Ergebnis. Ich finde auch mit Instruments keine Schwachstelle, ausser das sich mapView speichert reserviert(ca. 1.2MB) und erst beim beenden des Apps ihn wieder freigibt.

Kennt ihr das Problem, bzw. habt ihr eine Idee was ich noch tun könnte?


Danke und schöne Grüße, Sky.
 
ich würde jetzt spontan auf dein memory handling tippen.
hast irgendwas auf autorelease oder release was du mit retain behalten solltest?
 
Leider gar nichts. Autorelease benutze ich da nicht und alles andere wird entweder über den NaviController geregelt bei den Views oder per Hand mit dem [... release] wenn ich die Sachen beim wechseln in ein anderen View nicht mehr benötige.


Schöne Grüße, Sky.
 
Beispielcode wäre gut.

Alex
 
Hallo Alex,

hier meine AppMapView.h:
Code:
#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
#import "AppAddView.h"
#import "AppEditView.h"
#import "AppAnnotation.h"

@interface AppMapView : UIViewController <MKMapViewDelegate>
{
    MKMapView       *mapView;
    UIButton        *btnCenterView;
    UIView          *appScreen;
    NSMutableArray  *projectList;
    
    AppAnnotation   *addAnnotation;
}

- (void) loadAnnotations;
- (void) update;
- (void) actionSetCenter;
@end

Und hier die AppMapView.m:
Code:
#import "AppMapView.h"

@implementation AppMapView

- (void) update
{
    [self actionSetCenter];
}

- (id) init
{
    self = [super init];
    if (self) self.title = @"Projektkarte";
    
    return self;
}

- (void) actionSetCenter
{
    MKCoordinateRegion newRegion;
    newRegion.center.latitude = 50;
    newRegion.center.longitude = 10;
    newRegion.span.latitudeDelta = 7;
    newRegion.span.longitudeDelta = 7;
    
    [mapView setRegion:newRegion];    
    [self loadAnnotations];
}

- (void) goAddProject
{
    AppAddView *appAddView = [[AppAddView alloc] init];
    [[super navigationController] pushViewController:appAddView animated:YES];
    [appAddView release];
}

- (void) loadAnnotations
{
    [mapView removeAnnotations:mapView.annotations];
    
    NSString *uniquePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Liste.xml"];
    
    if ([[NSFileManager defaultManager] fileExistsAtPath:uniquePath])
    {
        projectList = [[NSMutableArray alloc] initWithContentsOfFile:uniquePath];
        
        CLLocationCoordinate2D newCoordinate;
        
        for (int cc = 0; cc < [projectList count]; cc++) 
        {
            newCoordinate.latitude = [[[projectList objectAtIndex:cc] objectForKey:@"Latitude"] doubleValue];
            newCoordinate.longitude = [[[projectList objectAtIndex:cc] objectForKey:@"Longitude"] doubleValue];
            
            addAnnotation = [[AppAnnotation alloc] init];
            
            [addAnnotation setCoordinate:newCoordinate];
            [addAnnotation setTitle:[[projectList objectAtIndex:cc] objectForKey:@"ProjectName"] setSubtitle:[[projectList objectAtIndex:cc] objectForKey:@"Leader"]];

            [mapView addAnnotation:addAnnotation];
            [addAnnotation release];
            
//            NSLog(@"Counter: %d  Projektort: %@  Latitude: %3.8f   Longitude: %3.8f", cc, [[projectList objectAtIndex:cc] objectForKey:@"ProjectName"], [[[projectList objectAtIndex:cc] objectForKey:@"Latitude"] doubleValue], [[[projectList objectAtIndex:cc] objectForKey:@"Longitude"] doubleValue]);
            
        }
            
    } else NSLog(@"Kein Datensatz gefunden!");     
    
}

- (void) showAppEditView:(id)sender
{
    AppEditView *appEditView = [[AppEditView alloc] initWithID:[sender tag]];
    [[super navigationController] pushViewController:appEditView animated:YES];
    [appEditView release];
}

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    MKPinAnnotationView *annView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:[annotation title]];
    [annView setAnimatesDrop:YES];
    [annView setCanShowCallout:YES];
    [annView setSelected:YES];
    [annView setUserInteractionEnabled: YES];
    
    UIButton *discloseButton = [UIButton buttonWithType: UIButtonTypeDetailDisclosure];
    
    for (int cc = 0; cc < [projectList count]; cc++)
    {
        if ([[projectList objectAtIndex:cc] objectForKey:@"ProjectName"] == [annotation title]) 
        {
            [discloseButton setTag:cc];

            switch ([[[projectList objectAtIndex:cc] objectForKey:@"PinColor"] intValue]) {
                case 0:
                    [annView setPinColor:MKPinAnnotationColorRed];
                    break;
                case 1:
                    [annView setPinColor:MKPinAnnotationColorPurple];
                    break;
                case 2:
                    [annView setPinColor:MKPinAnnotationColorGreen];
                    break;
            }
        }
    }
    [discloseButton addTarget:self action:@selector(showAppEditView:) forControlEvents:UIControlEventTouchUpInside];
    
    [annView setRightCalloutAccessoryView:discloseButton];
    
    return annView;
}

- (void) loadView
{
    appScreen = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.view = appScreen;
    
    mapView = [[MKMapView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    [appScreen addSubview:mapView];
    
    [mapView setMapType:MKMapTypeStandard];
    [mapView setDelegate:self];
    
    btnCenterView = [UIButton buttonWithType:UIButtonTypeInfoDark];
    [btnCenterView setCenter:CGPointMake(290.0f, 400.0f)];
    [btnCenterView addTarget:self action:@selector(actionSetCenter) forControlEvents:UIControlEventTouchUpInside];
    [appScreen addSubview:btnCenterView];
    
    [[super navigationItem] setRightBarButtonItem:[[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd 
                                                                                                 target:self 
                                                                                                 action:@selector(goAddProject)] 
                                                   autorelease]];
}

- (void) viewDidAppear:(BOOL)animated
{
    [self update];
}

- (void) dealloc
{
    [projectList release];
    [btnCenterView release];
    [appScreen release];

    [super dealloc];
}

@end

In der Datei Liste.xml stehen die Daten für die Pins drin.


Schöne Grüße, Sky.
 
So, ich habe noch ein wenig rumgetestet. Irgend wie muss es was im Hintergrund geben, das ich nicht finde. Weil wenn ich die

Code:
- (void) viewDidAppear:(BOOL)animated
{
    [self update];
}

Methode rausnehme und per Button von Hand die Pins aktualisiere kommt der Fehler auch noch. Mit anderen Worten, wenn ich die AddMapView verlasse und egal wie ich dort wiederkomme, fast jedes mal (manchmal erst beim 2. Besuch) gibt es einen Crash und in Xcode kommt nur der grüne Balken in der main.m mit dem Hinweis "EXC_BAD_ACCESS". Nur da ich dort nichts habe was auf den Speicher hinweist, wie kann ich es dann wegnehmen?


Schöne Grüße, Sky.
 
Kurze Frage in die Runde, hat irgend wer Erfahrung mit dem MKMapView? Ich konnte mein Problem immer noch nicht lösen, aber vielleicht hilft ja ein anderer Ansatz um das ganze umzustrukturieren.


Schöne Grüße, Sky.

EDIT: Also selbst wenn die Pins nicht geladen werden und somit auch nicht neugesetzt werden müssen, stürzt das Programm immer wieder ab. Das gleiche passiert auch wenn ich nichts mache, also nicht einmal eine Positionierung vornehme. Langsam gehen mir echt die Karten(blödes Wortspiel gerade) aus.
 
Zuletzt bearbeitet:
probier mal den mapview per retain im speicher zu halten, so dass der nicht weggeräumt wird...
 
Ich habe mal geschaut, mapView wird gar nicht abgeräumt.

Ich denke mal ich habe den Fehler gefunden, zu mindestens stürzt das App. Jetzt nur noch sehr sehr selten ab. Das Problem lag im freisetzen des nächsten Views. Da gab es ein Problem beim dealloc. Dies wurde erst ausgeführt wenn beim Rücksprung alles fertig geladen wurde. Das wusste ich leider nicht, aber NSLog sei dank.


Danke für eure Hilfe, Sky.
 
Zurück
Oben Unten