我正在开发一个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通知调用者。
我认为这将为解决问题提供更多线索。
再次感谢您
答案 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];
它再次运作。
伙计们,非常感谢你的支持。