0

enter code here我有两个视图控制器。当我将一个视图控制器移动到另一个视图控制器时,(void)viewDidUnload 函数不会自动调用。因此它增加了我对应用程序的内存分配。在这些视图控制器之间移动 2,3 次后,我的应用程序卡住了。

当我使用 ios7 模拟器时,它没有卡住。如何释放未使用的内存?当我移动到第二个视图控制器时,如何自动调用 (void)viewDidUnload 函数?
这是内存使用量。当我在两个视图控制器之间导航时它会增加

按钮点击事件

[self performSegueWithIdentifier:@"linktoviewmeetingitem" sender:tableView];

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"linkquicksearch"]) {
        ViewControllerSearch *searchScreen = [[ViewControllerSearch alloc] initWithNibName:@"ViewControllerSearch" bundle:nil];
        searchScreen = (ViewControllerSearch*)segue.destinationViewController;
        [searchScreen setSearchString:_txtSearch.text];
        searchScreen = nil;
    }
}
4

3 回答 3

1

此方法在 iOS6 中已被弃用......甚至在那时 viewDidUnload 仅在您的 viewController 被释放时调用,而不是在转换到另一个视图控制器期间/之后。- 每次“转换”时都在实例化一个已经实例化的 viewController - 导致内存问题。

您需要将 viewController 的 [alloc init] 包装在 if 语句中,以检查所述 viewController 实例是否已经存在。

来自文档:viewDidUnload 当控制器的视图从内存中释放时调用。(在 iOS 6.0 中已弃用。视图不再在内存不足的情况下被清除,因此永远不会调用此方法。) - (void)viewDidUnload 讨论 在 iOS 5 和更早版本中,当内存不足的情况发生时,当前视图控制器的视图不需要,系统可以选择在视图控制器的视图释放后调用此方法。这种方法是您执行任何最终清理的机会。如果您的视图控制器存储了对视图或其子视图的单独引用,您可以使用此方法来释放这些引用。您还可以使用此方法删除对您为支持视图而创建但在视图消失后不再需要的任何对象的引用。您不会使用此方法发布用户数据或任何其他无法轻松重新创建的信息。在 iOS 6 及更高版本中,不需要清除视图控制器中对视图和其他对象的引用。在调用此方法时,视图属性为 nil。

于 2013-11-04T11:45:28.290 回答
0

仅仅因为您离开视图控制器,它就不会被卸载。如果您想在视图控制器被导航离开时捕获事件,请使用

- (void)viewWillDisappear:(BOOL)animated;

如果您想在发生之前捕获它,或者

- (void)viewDidDisappear:(BOOL)animated;

如果你想在之后赶上活动。

于 2013-11-04T11:51:43.047 回答
0

基本上在 iOS7 和 ARC 上从来没有人使用过- (void)viewDidUnload{}

但您可以在此模式示例中使用强制内存解锁:

在你.hIBOutlet这样的:

@property (strong, nonatomic) IBOutlet UISlider *progressSlider;

比在你的.m文件中你可以使用:

- (void)viewDidUnload {
    [super viewDidUnload];
    [self setProgressSlider:nil];
}

希望这对你有帮助

于 2013-11-04T12:08:57.177 回答