Вопрос по ios, iphone – «EXC_BAD_ACCESS» при слишком быстром переключении между tableView и mapView

0

У меня есть tableView с кнопкой, чтобы нажать на mapView. Пуш и обратно обычно работают нормально. Если я быстро переключусь между этими двумя представлениями, & quot; EXC_BAD_ACCESS & quot; ошибка появится.

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]; нет & quot; EXC_BAD_ACCESS & quot; больше.

Любые ответы и комментарии будут оценены. Заранее спасибо!

Редактировать 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:

Аннотация whereAmIAnote объявлена здесь:

MapViewController.m

@interface AddrCoordinateAdjustMapViewController()

@property (retain) WhereAmIAnnotation *whereAmIAnnotation;

@end
@implementation MapViewController
@synthesize whereAmIAnnotation;

Edit 4:

Сообщение об ошибке выглядит следующим образом:

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

Обычно происходит сбой при переключении обратно наtableView в то время какannotationView падает

@MarcoPace PLZ проверьте обновление моего вопроса lu yuan
Вы пытались вставить точку останова и проверить значение self.mapView и self.whereAmIAnnotation? Попробуйте выполнить простую проверку: if (self.mapView & amp; self.whereAmIAnnotation) ... Marco Pace
ты пробовал отлаживать? Поставьте точку останова исключения, чтобы увидеть, на какой линии происходит сбой? Krishnabhadra
Как вы устанавливаете self.mapView? Это IBOutlet? Вы делаете это по коду. Можете ли вы показать, как вы установите и отпустите его? iTukker
@iTukker Это IBOutlet. Я никогда не выпускал его, так как это будет авто-релиз. lu yuan

Ваш Ответ

4   ответа
0

У меня была похожая проблема, и мое решение состояло в том, чтобы удалить все наложения с карты, прежде чем вывести контроллер из UINavigationController. Я использовал OpenStreetMap.

3

Вы удалили себя в качестве делегата карты?

self.mapview.delegate = nil;

попробуйте удалить его в viewWilldisappear или всякий раз, когда вы считаете это необходимым, так как это может понадобиться вам позже, если вы нажали контроллер представления и вернетесь к представлению позже.

В двух словах, удалите его, когда ваше представление не может ответить делегату, поэтому вы получили EXC_BAD_ACCSS. он отправил вам сообщение, но он уже был освобожден из памяти.

Error: User Rate Limit Exceeded lu yuan
1

Вы освобождаете и устанавливаете все свои IBOutlets в viewDidUnload? По крайней мере, вы должны сделать:

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

Как правило, в ViewDidUnload вы должны освобождать и устанавливать в nil любые объекты представления, созданные из файла Nib или выделенные в вашем методе ViewDidLoad.

Error: User Rate Limit Exceeded lu yuan
0

Я бы посоветовал проверить, не выпущено ли self.whereAmIAnnotation к моменту добавления его в mapView. Это может быть одной из причин получения BAD_ACCESS.

Error: User Rate Limit Exceeded lu yuan

Похожие вопросы