【问题标题】:"EXC_BAD_ACCESS" when switch too fast between an tableView and a mapView在 tableView 和 mapView 之间切换太快时出现“EXC_BAD_ACCESS”
【发布时间】:2012-06-05 08:15:21
【问题描述】:

我有一个带有按钮的 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”了。

任何答案和 cmets 将不胜感激。提前致谢!

编辑 2

ma​​in.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 正在下降时,它通常会崩溃。

【问题讨论】:

  • 您是否尝试插入断点并检查 self.mapView 和 self.whereAmIAnotation 的值?尝试做一个简单的检查: if(self.mapView && self.whereAmIAnnotation)...
  • 你试过调试吗?放一个异常断点,看看是哪一行发生了崩溃?
  • 如何设置self.mapView?是 IBOutlet 吗?你是通过代码来做的吗?你能展示一下你是如何设置和释放它的吗?
  • @MarcoPace 请检查我的问题的更新
  • @iTukker 这是一个 IBOutlet。我从来没有释放它,因为它会自动释放。

标签: iphone ios mkmapview exc-bad-access


【解决方案1】:

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

self.mapview.delegate = nil;

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

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

【讨论】:

  • 非常感谢。真的是说到点子上了!我应该在离开 mapview 时将 mapview 的委托设置为 nil。
【解决方案2】:

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

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

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

【讨论】:

  • 是的,应该在viewDidUnload中设置为nil,但错误依旧存在:)
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    我遇到了类似的问题,我的解决方案是在从 UINavigationController 弹出控制器之前从地图中删除所有叠加层。我使用的是 OpenStreetMap。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 2023-03-19
      • 2011-11-29
      • 2014-09-12
      • 2011-06-18
      • 1970-01-01
      相关资源
      最近更新 更多