2012-06-05 53 views
0

我有一個帶有按鈕的tableView來推送mapView。推送和回退操作通常工作正常。如果我在這兩個視圖之間快速切換,則會出現「EXC_BAD_ACCESS」錯誤。當在tableView和mapView之間切換太快時出現「EXC_BAD_ACCESS」

MapViewController.m

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
self.mapView.delegate = self;  

UIButton *btnL = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40.0, 40.0)]; 
[btnL setImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal]; 
[btnL addTarget:self.navigationController action:@selector(popViewControllerAnimated:) forControlEvents:UIControlEventTouchDown]; 
self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:btnL] autorelease]; 
[btnL release]; 

self.whereAmIAnnotation = [[[WhereAmIAnnotation alloc] init] autorelease]; 

if (!self.mapView || !self.whereAmIAnnotation) { 
    NSLog(@"mapview : %@", self.mapView); 
    NSLog(@"whereAmIAnnotation : %@",self.whereAmIAnnotation); 
// will never enter in to here 
} 

[self.mapView addAnnotation:self.whereAmIAnnotation]; 

} 

如果我評論[self.mapView addAnnotation:self.whereAmIAnnotation];,沒有 「EXC_BAD_ACCESS」 了。

任何答案和意見將不勝感激。提前致謝!

編輯2

的main.m

#import <UIKit/UIKit.h> 

#import "AppDelegate.h" 

int main(int argc, char *argv[]) 
{ 
@autoreleasepool { 
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
// "EXC_BAD_ACCESS" error message shows here 
} 
} 

編輯3:

的whereAmIAnnotation這裏宣稱:

MapViewController.m

@interface AddrCoordinateAdjustMapViewController() 

@property (retain) WhereAmIAnnotation *whereAmIAnnotation; 

@end 
@implementation MapViewController 
@synthesize whereAmIAnnotation; 

編輯4:

錯誤消息是如下:

2012-07-30 15:56:19.735 myApp[13584:707] *** -[MapViewController respondsToSelector:]: message sent to deallocated instance 0x10195e80 

它通常當我切換回tableViewannotationView正在下降崩潰。

+0

您是否嘗試插入斷點並檢查self.mapView和self.whereAmIAnnotation的值? 試着做一個簡單的檢查:if(self.mapView && self。whereAmIAnnotation)... –

+0

你試過調試過嗎?設置一個異常斷點來查看崩潰正在發生哪一行? – Krishnabhadra

+0

你如何設置self.mapView?它是一個IBOutlet嗎?你是否通過代碼來做到這一點。你能展示你如何設置和釋放它嗎? – iTukker

回答

3

你有沒有取出自己作爲mapview的代表?

self.mapview.delegate = nil; 

嘗試在viewWilldisappear移除或當你認爲必要的,因爲你可能以後需要它,如果你有推視圖控制器,稍後會返回到視圖。

簡而言之,當您的視圖無法響應委託時,將其刪除,這就是您獲得EXC_BAD_ACCSS的原因。它向您的視圖發送了一條消息,但它已經從內存中釋放。

+0

非常感謝。這真的很重要!我應該將mapview的委託設置爲零,同時離開mapview。 –

0

我會建議檢查self.whereAmIAnnotation是否已在您將其添加到mapView時發佈。這可能是您收到BAD_ACCESS的原因之一。

+0

plz檢查我的問題更新。 –

1

您是否釋放並將viewDidUnload中的所有IBOutlet設置爲零?所以,至少你應該做的:

- (void)viewDidUnload { 
    self.mapView = nil; 
    [super viewDidUnload]; 
} 

一般在ViewDidUnload你應該釋放並設置爲零,這是從筆尖文件創建或分配在您的viewDidLoad方法中的任何視圖對象

+0

是的,它應該被設置爲無viewDidUnload,但錯誤仍然存​​在:) –

0

我有類似的問題,我的解決方案是從UINavigationController彈出控制器之前從地圖中刪除所有覆蓋。我正在使用OpenStreetMap。

相關問題