调用UIViewController并且永远不会被释放

时间:2012-03-01 16:50:16

标签: ios uiviewcontroller dealloc

我的类OTNetwork是UIViewController的子类。

当用户按下按钮时,我使用此代码来调用它:

OTNetwork *net = [[OTNetwork alloc] initWithNibName:@"OTNetwork" bundle:nil];

[self presentModalViewController:net animated:YES];

[net release];

当用户想要退出时,按下一个按钮,OTNetwork对象发送一个通知,使调用者ViewController关闭视图控制器。这是代码:

[self dismissModalViewControllerAnimated:YES];

我的问题是永远不会调用OTNetwork对象dealloc方法。这是对永不停止的计时器的无效调用。一个附带的问题是内存泄漏。

在调用者View Controller中,此对象仅由这些代码行创建和解除。

请帮忙吗?

提前致谢!

3 个答案:

答案 0 :(得分:1)

当你将OTNetwork对象传递给self时,我假设它是一个navigationController,那么你的OTNetwork对象就在发布池中,你不必担心它被解除分配也导致你的代码在内存管理上很好

所以简短的回答,它在自动释放池中

答案 1 :(得分:1)

您可以尝试使用自己的自动释放池来调用dealloc。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
try{
//your code for allocating that object
 OTNetwork *net = [[[OTNetwork alloc] initWithNibName:@"OTNetwork" bundle:nil] autorelease]; [self presentModalViewController:net animated:YES];
}
finally{
[pool drain];
}

答案 2 :(得分:1)

自动释放永远不会保证何时会调用dealloc,你不应该依赖它。

自动释放池应该用于线程或者在闭环中有大量内存分配时。它不应该在已经在单独的池中运行的主线程上使用。

您可能应该将无效计时器调用移至OTNetwork类中的viewDidUnload或viewWillDisappear。

希望有所帮助。

[更新:2012年3月2日]

如果您想确保调用dealloc,请尝试以下

1)存储对OTNetwork控制器的引用

OTNetwork *net = [[OTNetwork alloc] initWithNibName: @"OTNetwork" bundle: nil];
net.delegate = self;
self.modalV = net; // @property (nonatomic, strong) OTNetwork *modalV;
[net release];

[self presentModalViewController: modalV animated: YES];

2)在OTNetwork中定义一个协议/代理,以便在它关闭时报告

// .h
@protocol OTNetworkDelegate;
    - (void) netViewClosed;
@end

// .m
- (void) viewDidUnload
{
    [self.delegate netViewClosed];
}

3)在mainViewController中,实现协议

- (void) netViewClosed
{
    if(modalV)
    {
        [modalV release], modalV = nil;
    }
}