2012-08-30 15 views
5

Wiem, że ten błąd ma coś wspólnego z zarządzaniem pamięcią, ale muszę przyznać, że jestem zakłopotany! Programowanie w obiektywnym c przez około 3 tygodnie i całe to zarządzanie pamięcią jest mylące! W zasadzie dzieje się tak, że mam ten widok mapy w widoku tabeli. Po kliknięciu przycisku Wstecz, aby opuścić widok mapy i powrócić do menu głównego, pojawia się powyższy błąd. Oto kod z plikuEXC_BAD_ACCESS (code = 1) Błąd w Xcode

#import <UIKit/UIKit.h> 
#import <MapKit/MapKit.h> 

@interface MapViewController : UIViewController <MKMapViewDelegate> { 

    IBOutlet MKMapView* mapView; 
    BOOL locate; 

} 

@property (nonatomic, retain) IBOutlet MKMapView* mapView; 

@end 

nagłówka i pliku wdrażania

#import "MapViewController.h" 

@implementation MapViewController 

@synthesize mapView; 

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    mapView = [[MKMapView alloc] initWithFrame:self.view.frame]; 
    mapView.delegate=self; 
    mapView.showsUserLocation = YES; 

    [self.view addSubview:mapView]; 

    [self.mapView.userLocation addObserver:self 
           forKeyPath:@"location" 
            options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) 
            context:nil]; 
    locate = YES; 

} 

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 

    if (locate == YES) { 
    MKCoordinateRegion region; 
    region.center = self.mapView.userLocation.coordinate; 

    MKCoordinateSpan span; 
    span.latitudeDelta = 0.1; 
    span.longitudeDelta = 0.1; 
    region.span = span; 

    [self.mapView setRegion:region animated:YES]; 
     locate = NO; 
    } 

} 

- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 
- (void)dealloc { 
    [super dealloc]; 
    [mapView release]; 
    [self.mapView.userLocation removeObserver:self forKeyPath:@"location"]; 
    [self.mapView removeFromSuperview]; 
    self.mapView = nil; 
} 

@end 

Czy ktoś może rzucić nieco światła na mnie? :)

+0

Próbowałem komentowania różne linie kodu, aby sprawdzić, czy mógłbym to rozwiązać, ale za każdym razem jest to samo, ponieważ powiedziałem, że jestem całkiem nowy, więc każda pomoc, nawet przy debugowaniu, byłaby doceniona :) (Przykro mi być bez pojęcia ból w tylnej lol) – Craig

Odpowiedz

12

[super dealloc]; musi być ostatni dzwonek w dealloc

również po [mapView release]; MapView może być już nie ma.

spróbować

- (void)dealloc { 

    [self.mapView.userLocation removeObserver:self forKeyPath:@"location"]; 
    [self.mapView removeFromSuperview]; 
    [mapView release]; 
    self.mapView = nil; 
    [super dealloc]; // at this point self — that is the same object as super — is not existent anymore 
} 
+0

Nadal się wywala z tym samym błędem obawiam się :( – Craig

+1

możesz podać jako pełny komunikat o błędzie? – vikingosegundo

+0

EXC_BAD_AC CESS (kod = 1, adres = 0xa0e69c14), ale adres pamięci zmienia się za każdym razem. Po prostu edytowane, aby dodać trochę przejrzystości, bo zapomniałem wspomnieć, kiedy aplikacja się zawiesza>. < – Craig

0

Ten błąd może być również spowodowane przez niezgodną API (np. Zbudować dla iOS 6.0, ale użyć metody wprowadzone tylko w iOS> = 8.2)

+1

To nie jest odpowiedź, bardziej jak komentarz. – Zippy

+0

Mam za mało reputacji, aby publikować komentarze, niech to będzie) – schmidt9

Powiązane problemy