2014-07-21 64 views
1

我遇到了一個錯誤。我在我的地圖中使用OSM瓷磚,因爲它們更好地顯示我的位置。所以,我的viewDidLoad是:EXC_BAD_ACCESS當瓷磚加載之前從MapView退出時

[super viewDidLoad]; 

self.mapView.delegate = self; 
self.searchBar.delegate = self; 
self.title = @"Select Location"; 
NSString *template = @"http://tile.openstreetmap.org/{z}/{x}/{y}.png"; 
MKTileOverlay *overlay = [[MKTileOverlay alloc] initWithURLTemplate:template]; 
overlay.canReplaceMapContent = YES; 
[self.mapView addOverlay:overlay level:MKOverlayLevelAboveLabels]; 

self.locationManager = [[CLLocationManager alloc] init]; 
if ([CLLocationManager locationServicesEnabled]) { 
    self.locationManager.delegate = self; 
    self.locationManager.distanceFilter = 1000; 
    [self.locationManager startUpdatingLocation]; 
} 

self.geocoder = [[CLGeocoder alloc] init]; 
... 

好了,錯誤出現,當我嘗試按BACK或選擇當前定位銷(我有一個UIButton就可以了,之前所有視圖的瓦片裝。

我檢查this問題,並將此:

- (void)viewWillDisappear:(BOOL)animated { 
self.mapView = nil; 
[super viewWillDisappear:animated]; 
} 

我試圖用兩個viewWillDisappeardealloc這個代碼,但既不似乎工作。接下來,我已經覆蓋後退按鈕的動作,仍然有這個問題:

- (void)viewWillDisappear:(BOOL)animated { 
if ([self.navigationController.viewControllers indexOfObject:self] == NSNotFound) { 
    self.locationManager.delegate = nil; 
    self.mapView = nil; 
    self.searchBar.delegate = nil; 
    [self.navigationController popViewControllerAnimated:YES]; 
} 
[super viewWillDisappear:animated]; 
} 

EXC_BAD_ACCESS通常出現,當某事試圖訪問的對象,當它有;已準備好釋放,據我所知。

如何正確釋放所有數據?

UPD: 的例外出現在行: return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

它出現在第一線:

libobjc.A.dylib`objc_msgSend: 
0x3b172620: cbz r0, 0x3b17265e   ; objc_msgSend + 62 
0x3b172622: ldr.w r9, [r0] 
0x3b172626: ldrh.w r12, [r9, #12] <<<< Here 

最後在這裏UIApplicationMain

0x3316e148: blx 0x33731cc4    ; symbol stub for: CFRunLoopSourceSignal$shim 
0x3316e14c: movs r0, #0x0 <<< This line 

UPD2 : 那麼,模擬器上運行的殭屍和檢查堆棧顯示了這樣的事情:stack

據我所知,當MKTileOverlay試圖加載瓷磚解除分配的MapView時,出現問題。這可以如何解決?

+0

你使用arc進行內存管理嗎? –

+0

@ Daij-Djan是的,我的 – ka2m

+0

使用殭屍工具和找出哪些類訪問?! –

回答

1

好吧,似乎我找到了解決方案。

產地來自here

我做了兩個修復。首先,我感動了所有瓦塊處理,以異步塊:

dispatch_async(dispatch_get_main_queue(), ^{ 
    NSString *template = @"http://tile.openstreetmap.org/{z}/{x}/{y}.png"; 
    MKTileOverlay *overlay = [[MKTileOverlay alloc] initWithURLTemplate:template]; 
    overlay.canReplaceMapContent = YES; 
    [self.mapView addOverlay:overlay level:MKOverlayLevelAboveLabels];}); 

接下來,我添加了此行dealloc和刪除viewWillDisappear

- (void)dealloc 
{ 
    [self.mapView removeOverlays:[self.mapView overlays]]; 
} 

現在看來工作。