0

mapViewを押すためのボタンが付いたtableViewがあります。プッシュおよびバックアクションは通常、正常に機能します。これら2つのビューをすばやく切り替えると、「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

がドロップしているtableView間にに戻ると、通常はクラッシュします。annotationView

4

4 に答える 4

3

マップビューの代理人として自分自身を削除しましたか?

self.mapview.delegate = nil;

viewWilldisappearで削除するか、View Controllerをプッシュして後でビューに戻る場合は後で必要になる可能性があるため、必要と思われる場合はいつでも削除してみてください。

簡単に言うと、ビューがデリゲートに応答できない場合は削除します。これが、EXC_BAD_ACCSSを取得した理由です。ビューにメッセージを送信しましたが、すでにメモリから解放されています。

于 2012-07-30T05:08:04.243 に答える
1

viewDidUnload内のすべてのIBOutletsを解放し、nilに設定しますか?したがって、少なくとも次のことを行う必要があります。

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

通常、ViewDidUnloadでは、Nibファイルから作成された、またはViewDidLoadメソッドで割り当てられたビューオブジェクトを解放してnilに設定する必要があります。

于 2012-06-05T09:03:22.963 に答える
0

mapViewに追加するときに、self.whereAmIAnnotationがまだリリースされていないかどうかを確認することをお勧めします。これが、BAD_ACCESSを受け取る理由の1つである可能性があります。

于 2012-06-05T08:20:34.660 に答える
0

私も同様の問題を抱えていました。私の解決策は、UINavigationControllerからコントローラーをポップする前に、マップからすべてのオーバーレイを削除することでした。私はOpenStreetMapを使用していました。

于 2014-11-18T08:39:39.293 に答える