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

标签 ios uiviewcontroller dealloc

我有 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/

相关文章:

ios - Swift 4 UIWebView 视频全屏约束错误

ios - 使用 [self.labelIBOutlet release] 与 [labelIBOutlet release]

swift - 符合协议(protocol)但没有任何反应

ios - didReceiveMemoryWarning 和 dealloc 之间有什么关系?

ios - 为什么在 dealloc 方法中没有释放对象?

ios - UIScrollview 从 View 到 View 的动画过渡

ios - 如何均衡立体声输入并将音频效果仅应用于 iOS 上的单声道?

ios - MKMapView swift : MKPointPointAnnotation Centre of screen

ios - 使用 Core Data 从 NSMutableArray 创建对象的 NSString

ios - 在 loadView 中初始化哪些数据比在 init 中更好