1

我有以下财产

。H

@property (nonatomic, strong) NSMutableDictionary *cache;

.m

@synthesize cache = _cache;

数据_cache建立在 viewDidLoad 上。现在我想知道_cache一旦视图控制器被卸载,是否会自动清理,还是我必须明确地做一个_cache = nil;in viewWillUnload

4

4 回答 4

2

无论您是否使用 ARC,它们都不会-viewDidUnload. 您必须明确释放它们(或将它们设置为nilARC。)

于 2012-06-04T00:43:01.000 回答
1

最简洁的答案是不。实例变量不会自动释放。它不会导致视图控制器上的释放。被控制的视图被清除。

您想要清除的任何内容都必须在 viewDidUnload 中显式完成(请注意,通过 IB 添加的变量将自动放置在该方法中)。

viewDidUnload 的典型场景是由控制器管理的视图不再出现在屏幕上(例如,另一个控制器已使用导航控制器推送)。系统检测到内存压力,您的视图已被卸载。

对视图中对象的任何弱引用都将被自动清除(只要您在某处没有对它们的额外强引用)。在 viewDidUnload 中,当视图显示在屏幕上时,您需要对可以重新加载的数据的强引用为零。

执行 viewDidUnload 与 dealloc 不同。如果您正在管理必须释放(或在 KVO 或通知中心注册)的资源,您也需要执行该工作。请注意,在这些情况下,您必须在 viewDidUnload 和 dealloc 中都执行它们(视情况而定)。

于 2012-06-04T04:08:05.257 回答
1

ARC不能回答,但是viewdidUnload不代表VC被释放。这意味着视图正在被释放。要强制它,您可以尝试使用 NavigationController,推送几个视图,然后在模拟器中发送一些内存警告。viewDidUnload 将为不是顶部的 vcs 调用。

Re: ARC,你当然可以有一个 dealloc 方法,它会在 vc 发布时调用。根本不叫超级。

于 2012-06-04T04:08:19.233 回答
0

你可以加:

-(void)dealloc { 
    // If you are using ARC remove the line below
    [super dealloc]
} 

并放置一个断点,它会告诉你它什么时候被释放。dealloc 方法也将被 ARC 调用,只要确保你不要在 ARC 中调用 [super dealloc]。

于 2012-06-04T01:28:13.960 回答