0

我有一个带有按钮的 tableView 来推送 mapView。push 和 back 动作通常可以正常工作。如果我在这两个视图之间快速切换,会出现“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

主文件

#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:

whereAmIAnotation 在这里声明:

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

当我切换回正在下降的tableView时候,它通常会崩溃。annotationView

4

4 回答 4

3

您是否已将自己移除为地图视图的代表?

self.mapview.delegate = nil;

尝试在 viewWilldisappear 或您认为有必要时将其删除,因为如果您已推送视图控制器并稍后返回视图,则可能稍后需要它。

简而言之,当您的视图无法响应委托时将其删除,这就是您获得 EXC_BAD_ACCSS 的原因。它向您的视图发送了一条消息,但它已经从内存中释放了。

于 2012-07-30T05:08:04.243 回答
1

您是否在 viewDidUnload 中释放并设置为零所有 IBOutlets?所以至少你应该这样做:

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

通常在 ViewDidUnload 中,您应该释放并设置为 nil,从 Nib 文件创建或在 ViewDidLoad 方法中分配的任何视图对象

于 2012-06-05T09:03:22.963 回答
0

I had similar problem and my solution was to remove all overlays from the map before popping controller from UINavigationController. I was using OpenStreetMap.

于 2014-11-18T08:39:39.293 回答
0

我建议在您将 self.whereAmIAnotation 添加到 mapView 时检查它是否尚未发布。这可能是您收到 BAD_ACCESS 的原因之一。

于 2012-06-05T08:20:34.660 回答