dealloc方法在运行时调用三次

时间:2009-12-18 00:21:07

标签: iphone cocoa-touch

我正在开发一个iphone应用程序,我的问题很小。 我在我的appdelegate.m文件中使用弹出调用方法,如下所示

-(void)OpenInfo{
    InfoDetail *detail = [[InfoDetail alloc] initWithNibName:@"InfoDetail" bundle:nil];
    self.infoDetail = detail;
    [detail release];
    [window addSubview:detail.view];
 }

-(void)OpenNetworkSelection{
    NetworkSelection *netsel = [[NetworkSelection alloc] initWithNibName:@"NetworkSelection" bundle:nil] ;
    self.networkselection = netsel;
    [netsel release];
    [window addSubview:netsel.view];
 }

我正在从像

这样的视图中调用这些方法
StatusFoxAppDelegate *delegate = (StatusFoxAppDelegate*)[[UIApplication sharedApplication] delegate];
[delegate OpenInfo];    

这些助手视图和开放视图通过NSNotificationCenter进行通信。

我的问题是你可以看到“OpenInfo”和“OpenNetworkSelection”方法包含视图实例创建逻辑。

当我调用OpenInfo方法时,它应该是完美的工作。但是当我第二次尝试***时,“OpenNetworkSelection”无法正常工作*** - [UIButton发布]:消息发送到解除分配的实例0x3dbdb50错误。

好的我明白了。然后我将NSlog行放入NetworkSelection.m的Dealloc重载中 和OpenInfo.m文件,因为我需要行为的差异。

因此,OpenInfo dealloc方法正在处理视图关闭时(我的意思是从superview中删除)。但是NetworkSelection的dealloc方法执行了三次。我没有找到问题来源。

有人能告诉我,我做错了什么?

谢谢

编辑:

伙计们,我在NetworkSelection视图控制器中发现了一些错误。更多描述是;我在视图控制器中看到了这些代码行。

    CommonGateway *gw = [[CommonGateway alloc] InitWithDefaults];
self.gateway = gw;
[self.gateway GetAvailableNetworkList];
[self.gateway setCommDelegate:self];
[gw release];   

在这些代码行中,我正在进行异步服务器调用,当我注释掉这些行时,我的viewcontroller工作得很好,然后我创建了“LoadDataFromServer”方法,我从源代码传递了CommonGateway实例,就像那样

- (void)LoadDataFromServer{
CommonGateway *gw = [[CommonGateway alloc] InitWithDefaults];
self.gateway = gw;
[self.gateway GetAvailableNetworkList];
[self.gateway setCommDelegate:self];
[gw release];   
   }

我的appdelegate代码更改为;

-(void)OpenNetworkSelection{
NetworkSelection *netsel = [[NetworkSelection alloc] initWithNibName:@"NetworkSelection" bundle:nil] ;
self.networkselection = netsel;
self.networkselection.gateway = commonGateway;
[netsel release];
[window addSubview:self.networkselection.view];
[self.networkselection LoadDataFromServer];
  }

但结果相同,如果我注释掉“[self.networkselection LoadDataFromServer];”然后它正在工作。我的CommonGateway类通过NSNotificationCenter通知调用者。

我认为这将为解决问题提供更多线索。

再次感谢您

3 个答案:

答案 0 :(得分:4)

您在此处发布detail

[detail release];

之后你会尝试立即使用它:

[window addSubview:detail.view];

您的应用程序因发布detail而崩溃,但您仍尝试访问其(现在不存在的)属性。

所以你可能想要使用你的ivars,例如:

[window addSubview:self.infoDetail.view];

或者:

[window addSubview:[self.infoDetail view]];

您可能需要阅读Apple的Memory Management Programming Guide

答案 1 :(得分:0)

如果您接到三次dealloc的调用,那么表明您有三个同一个类的实例而不是一个。您应该在dealloc中设置断点并检查实例的地址以查看它是否每次都相同。我怀疑它不会。

但是,如果您在覆盖[super dealloc]时未对dealloc进行调用,则可能该对象实际上未被释放,而只是释放其iVars。在这种情况下,系统可能会在尝试杀死它时反复调用同一个实例的dealloc。

答案 2 :(得分:0)

伙计们,我发现了我的问题来源。 完全在CommonGateway类实现中存在问题 在这个类中,我正在使用构造函数

-(id)InitWithDefaults{
self = [super init];
NSOperationQueue *_queue = [[[NSOperationQueue alloc] init] autorelease];
self.queue = _queue;
[_queue release];
return self;

}

但这条线路是错误的,因为我正在使用这个CommonGateway课程,这是我项目的很多地方。当我改变

NSOperationQueue *_queue = [[[NSOperationQueue alloc] init] autorelease];

NSOperationQueue *_queue = [[NSOperationQueue alloc] init];

它再次运作。

伙计们,非常感谢你的支持。