我遇到了一個錯誤。我在我的地圖中使用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];
}
我試圖用兩個viewWillDisappear
和dealloc
這個代碼,但既不似乎工作。接下來,我已經覆蓋後退按鈕的動作,仍然有這個問題:
- (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 : 那麼,模擬器上運行的殭屍和檢查堆棧顯示了這樣的事情:
據我所知,當MKTileOverlay試圖加載瓷磚解除分配的MapView時,出現問題。這可以如何解決?
你使用arc進行內存管理嗎? –
@ Daij-Djan是的,我的 – ka2m
使用殭屍工具和找出哪些類訪問?! –