使用ARC的Ios 5应用程序上出现以下错误:

***-[ViewDettaglio responsesToSelector:]:消息发送到已释放实例0x12193300

在控制台上,我编写命令:

信息malloc-history 0x12193300

我得到以下堆栈跟踪:

分配:块地址:0x12193300长度:192
堆栈-pthread:0xa08a3540帧数:31
0:0x96bdab03在malloc_zone_calloc中
1:Calloc中的0x96bdaa5a
2:class_createInstance中的0x16f8c93
3:_objc_rootAllocWithZone中的0x170388b
4:+ [NSObject allocWithZone:]中的0x21af661
5:_objc_rootAlloc中的0x17038b9
6:/ [用户/.../ViewElenco.m:186中的[[ViewElenco CaricaViewDettaglio:]]中的0x2c4c8
7:0x2e550,位于/Users/.../ViewElenco.m:337中的[[ViewElenco mapView:annotationView:calloutAccessoryControlTapped:]]
8:0x3fa99c
9:MKLongHash中的0x405faa
10:-[NSObject performSelector:withObject:withObject:]中的0x21aeec9
-[UIApplication sendAction:to:from:forEvent:]中的11:0x60d5c2
-[UIApplication sendAction:toTarget:fromSender:forEvent:]中的12:0x60d55a
13:-[UIControl sendAction:to:forEvent:]中的0x6b2b76
14:-[UIControl(Internal)_sendActionsForEvents:withEvent:]中的0x6b303f
15:-[UIControl touchesEnded:withEvent:]中的0x6b22fe
16:-[UIWindow _sendTouchesForEvent:]中的0x632a30
17:[UIWindow sendEvent:]中的0x632c56
18:-[UIApplication sendEvent:]中的0x619384
19:_UIApplicationHandleEvent中的0x60caa9
20:PurpleEventCallback中的0x1a95fa9
21:__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__中的0x21811c5
22:__CFRunLoopDoSource1中的0x20e6022
23:__CFRunLoopRun中的0x20e490a
24:CFRunLoopRunSpecific中的0x20e3db4
25:在CFRunLoopRunInMode中为0x20e3ccb
26:GSEventRunModal中的0x1a94879
27:GSEventRun中的0x1a9493e
28:UIApplicationMain中的0x60aa9b
29:在/Users/.../main.m:14中的main中的0x20bb
30:开始时为0x2065

ViewElenco.m的第186行的代码如下:

ViewDettaglio * viewq = [[ViewDettaglio alloc] initWithNibName:@“ViewDettaglio” bundle:nil];

怎么会这样
我正在使用UINavigationController从ViewElenco和ViewDettaglio导航。

编辑

在下面的代码中可能吗:

ViewDettaglio * viewDettaglio = [[[ViewDettaglio alloc] initWithNibName:@“ViewDettaglio” bundle:nil];
viewDettaglio.idObject = idObj;
[self.navigationController pushViewController:viewDettaglio动画:是];

alloc返回一个释放对象?

最佳答案

问题已解决:在ViewDettaglio和ViewElenco中,有一个MKMapView,并且将委托设置为容器ViewController。
当在UINavigationController中推送新的ViewController时,由MapView创建的某些线程可能仍在运行并调用地图委托,即使它不可见。

解决方案是在视图将消失时将委托设置为null,然后在视图出现之前再次将其设置为:

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    self.mapView.delegate=nil;
}
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.mapView.delegate=self;
}

10-08 08:26