我有 OTNetwork 类,它是 UIViewController 的子类。
当用户按下按钮时,我使用此代码调用它:
OTNetwork *net = [[OTNetwork alloc] initWithNibName:@"OTNetwork" bundle:nil];
[self presentModalViewController:net animated:YES];
[net release];
当用户想要退出时,按下一个按钮,OTNetwork 对象发送一个通知,让调用者 ViewController 关闭 View Controller 。这是代码:
[self dismissModalViewControllerAnimated:YES];
我的问题是从未调用过 OTNetwork 对象的 dealloc 方法。这是对永不停止的计时器的无效调用。另一个问题是内存泄漏。
在调用者 View Controller 中,该对象仅由这些代码行创建和关闭。
有什么帮助吗?
提前致谢!
最佳答案
Autorelease 从不保证何时调用 dealloc,您不应该依赖它。
自动释放池应该用于线程,或者当您在闭环中分配大量内存时。它不应该在已经在单独的池中运行的主线程上使用。
您应该将无效计时器调用移动到 OTNetwork 类中的 viewDidUnload 或 viewWillDisappear。
希望对您有所帮助。
[更新:2012 年 3 月 2 日]
如果您想确保 dealloc 被调用,请尝试以下操作
1) 存储对 OTNetwork Controller 的引用
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 中定义一个协议(protocol)/委托(delegate),以在关闭时进行报告
// .h
@protocol OTNetworkDelegate;
- (void) netViewClosed;
@end
// .m
- (void) viewDidUnload
{
[self.delegate netViewClosed];
}
3) 在mainViewController中,实现协议(protocol)
- (void) netViewClosed
{
if(modalV)
{
[modalV release], modalV = nil;
}
}
关于ios - 调用 UIViewController 并且永远不会被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9520435/