gpt4 book ai didi

iphone - 将发布发送到 UIViewControllers 的 NSArray?

转载 作者:行者123 更新时间:2023-12-03 21:18:54 27 4
gpt4 key购买 nike

如果我有一个 UIViewController 的 NSArray 并将释放发送到该数组,是否会为每个 UIViewController 调用 viewDidUnload 或 dealloc ?或者两者都不是?

这就是我正在做的事情:

- (void) viewDidLoad {
UIViewController* profileController = [[ProfileController alloc] init];
..........
//all the other controllers get allocated same way

self.viewControllers = [[NSMutableArray alloc] initWithObjects: profileController, dietController, exerciseController, progressController, friendsController, nil];

[profileController release];
//other controllers get released same way ....
}

- (void) dealloc {
[viewControllers release];
NSLog("DEALLOC!");
//I know dealloc is being called
//what happens to the view controllers?
}

我在每个 View Controller 的 viewDidUnload 和 dealloc 方法中放置了一个断点,但它们没有被调用。

最佳答案

正如 pgb 提到的,您混淆了内存管理和 View Controller 生命周期这两个概念。每当 View Controller View 被卸载时,viewDidUnload就会被调用,这当然只有在 View 被加载时才会发生。在没有显示任何 View Controller 的情况下,您不应该期望看到 viewDidUnload 被调用。

您非常应该看到 dealloc 被调用!

您的问题在于 viewControllers 数组的初始化:

self.viewControllers = [[NSMutableArray alloc] 
initWithObjects: profileController,
dietController,
exerciseController,
progressController,
friendsController,
nil];

假设viewControllers是一个使用retain属性的属性,这将泄漏数组,从而泄漏数组的所有内容。问题是您已经分配了一个可变数组(因此保留计数 = 1),然后将其分配给 viewControllers 属性,这将增加保留计数。

在您的 dealloc 方法中,您(正确地)释放了数组,但这只会将保留计数减少到 1。

我建议的修复方法是将 autorelease 添加到上述代码中:

self.viewControllers = [[[NSMutableArray alloc] 
initWithObjects: profileController,
dietController,
exerciseController,
progressController,
friendsController,
nil] autorelease];

进行此更改后,您应该会看到在 View Controller 上调用 dealloc。您还应该期望看到在这些 View Controller 的 View 被卸载时调用 viewDidUnload (例如,当它们在基于导航 Controller 的应用程序中从堆栈中弹出时)。

关于iphone - 将发布发送到 UIViewControllers 的 NSArray?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6880296/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com