Ios dismissModalViewControllerAnimated不释放视图控制器
作为我应用程序启动的一部分,我在几个视图控制器之间循环。一切正常,但视图控制器未释放。(从未调用viewDidUnload和dealloc)。在每次状态更改之前,我将取消显示的任何视图控制器。它们将被解除,并为每个视图控制器调用ViewWillEnglish:Ios dismissModalViewControllerAnimated不释放视图控制器,ios,Ios,作为我应用程序启动的一部分,我在几个视图控制器之间循环。一切正常,但视图控制器未释放。(从未调用viewDidUnload和dealloc)。在每次状态更改之前,我将取消显示的任何视图控制器。它们将被解除,并为每个视图控制器调用ViewWillEnglish: - (void)stateChange:(NSString *)state { // Dismiss any exiting modals/popups [self dismissPopup]; [self dismissModalVi
- (void)stateChange:(NSString *)state {
// Dismiss any exiting modals/popups
[self dismissPopup];
[self dismissModalViewControllerAnimated: NO];
if([state isEqualToString:@"StateBoot"]) {
CLRemotePrimaryBootViewController * viewControllerBoot = [[CLRemotePrimaryBootViewController alloc]initWithNibName: @"CLRemoteBootView" bundle:nil];
[self presentModalViewController:viewControllerBoot animated:NO];
[viewControllerBoot release];
}
else if([state isEqualToString:@"StateLogin"]) {
CLRemotePrimaryAuthViewController *viewControllerAuth = [[CLRemotePrimaryAuthViewController alloc]initWithNibName: @"CLRemoteAuthView" bundle:nil];
[self presentModalViewController:viewControllerAuth animated:NO];
[viewControllerAuth release];
}
else if([state isEqualToString:@"StateMain"]) {
[self setSelectedIndex:0];
}
else if([state isEqualToString:@"StateStop"]) {
// TBD
}
}
解雇后,self.presentedViewController实际上为零。关于如何强制iOS释放这些未使用的视图控制器,有什么想法吗
编辑-
解决了!希望这篇文章能帮助别人-我很困惑。事实证明,我的模态视图控制器是从一个基类派生的,该基类在init方法中设置了观察者(NSNotificationCenter)。必须先移除这些观察者,然后才能释放观察视图控制器。在我的例子中,这变得更加困难,因为观察者是块而不是选择器。在添加这些观察者时,会为每个观察者返回id,因此我必须在NSMutableArray中跟踪这些观察者,并添加一个方法来释放基类中的观察者:
+ (void) safeUnsubscribe:(id)object {
if ( object != nil ) {
if ( [object isKindOfClass:[CLRemotePrimaryBaseViewController class]]) {
CLRemotePrimaryBaseViewController* viewController = (CLRemotePrimaryBaseViewController*)object;
[viewController unsubscribe];
}
}
+ (void) safeUnsubscribe:(id)object {
if ( object != nil ) {
if ( [object isKindOfClass:[CLRemotePrimaryBaseViewController class]]) {
CLRemotePrimaryBaseViewController* viewController = (CLRemotePrimaryBaseViewController*)object;
[viewController unsubscribe];
}
}
}
- (void)handle:(NSString *)name usingBlock:(CLObjBlock)block {
id observer = [[NSNotificationCenter defaultCenter] addObserverForName:name object:nil queue:nil usingBlock:^(NSNotification * notification){ block([notification object]); }];
[self.observers addObject:observer];
}
// Must call before dealloc or listener will never be released!
- (void)unsubscribe {
for ( id observer in self.observers ) {
[[NSNotificationCenter defaultCenter] removeObserver:observer];
}
[self.observers removeAllObjects];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
}
`
`-(void)句柄:(NSString*)名称使用block:(CLObjBlock)block{
}`
//必须在解除锁定之前调用,否则侦听器将永远不会被释放代码>
`-(无效)取消订阅{
for ( id observer in self.observers ) {
[[NSNotificationCenter defaultCenter] removeObserver:observer];
}
[self.observers removeAllObjects];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}视图控制器中有尚未释放的对象。为每个视图控制器定义dealloc方法(记住调用[super dealloc]),并放置断点以确定是否正在调用
查看每个视图控制器中已分配的任何对象,并确保其已释放。已解决!希望这篇文章能帮助别人-我很困惑。事实证明,我的模态视图控制器是从一个基类派生的,该基类在init方法中设置了观察者(NSNotificationCenter)。必须先移除这些观察者,然后才能释放观察视图控制器。在我的例子中,这变得更加困难,因为观察者是块而不是选择器。在添加这些观察者时,会为每个观察者返回id,因此我必须在NSMutableArray中跟踪这些观察者,并添加一个方法来释放基类中的观察者:
+ (void) safeUnsubscribe:(id)object {
if ( object != nil ) {
if ( [object isKindOfClass:[CLRemotePrimaryBaseViewController class]]) {
CLRemotePrimaryBaseViewController* viewController = (CLRemotePrimaryBaseViewController*)object;
[viewController unsubscribe];
}
}
+ (void) safeUnsubscribe:(id)object {
if ( object != nil ) {
if ( [object isKindOfClass:[CLRemotePrimaryBaseViewController class]]) {
CLRemotePrimaryBaseViewController* viewController = (CLRemotePrimaryBaseViewController*)object;
[viewController unsubscribe];
}
}
}
- (void)handle:(NSString *)name usingBlock:(CLObjBlock)block {
id observer = [[NSNotificationCenter defaultCenter] addObserverForName:name object:nil queue:nil usingBlock:^(NSNotification * notification){ block([notification object]); }];
[self.observers addObject:observer];
}
// Must call before dealloc or listener will never be released!
- (void)unsubscribe {
for ( id observer in self.observers ) {
[[NSNotificationCenter defaultCenter] removeObserver:observer];
}
[self.observers removeAllObjects];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
您应该将修复作为您自己问题的答案发布,然后接受它。我不清楚你是不是找到了解决办法,直到把你的问题挖掘出来。