我的类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中,此对象仅由这些代码行创建和解除。
请帮忙吗?
提前致谢!
答案 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;
}
}