2012-06-05 26 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。

相关问题