0

我正在使用 ARC(自动引用计数)。

如果我将IBOutletsin 设置为 nilviewDidDisappear可以viewDidUnload吗?

比如这些:

[self setTheImage:nil];
[self setBTNplay:nil];
[self setBTNstop:nil];

我正在编写一个基于导航的应用程序,其中包括pageViewController,我在 Instruments 中测试了我的应用程序以查看内存泄漏,并且我不断收到内存警告消息。我什至在viewDidUnload方法中放了一个日志代码。但是当我弹出时它似乎没有被调用rootViewController

还有一件事:如果每个页面都有一个 audioPlayer,我应该在哪里将 a 设置@property (nonatomic, strong) AVAudioPlayer *audioPlayer;为 nil?

或者我如何将它设置为弱而不是强?因为它在此代码行中给了我一个“警告”:

_audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:poemURL error:nil];

它说:将保留对象分配给弱变量

4

4 回答 4

2

您不需要在viewDidUnload. 确保您使用的是弱属性而不是强属性或为IBOutlets 赋值。收到内存警告并不一定意味着您正在泄漏。收到内存警告意味着您的应用程序消耗了太多内存。运行 Instruments 并使用您的应用程序使用多少内存来编辑您的问题。

您正在使用的事实AVAudioPlayer让我觉得您可能正在将一些大量的音频文件拉入内存。

顺便说一句,initWithContentsOfURL:error:因为你阻塞了主线程,你会被 App Store 拒绝。尝试在仅启用蜂窝网络的 iPhone 上测试您的应用程序,然后进入您办公室/房屋中互联网连接不良的部分。还可以尝试将手机切换到飞行模式。您的应用程序无疑会在连接失败之前冻结很长时间,或者它会简单地崩溃。

相反,您应该使用盛大的中央调度或通过NSURLConnection块或委托方法下载它。

于 2012-07-04T19:58:36.537 回答
2

首先,不要将您的属性设置为零,viewDidDisappear因为您的视图仍在加载。您必须始终将它们设置为 nil in viewDidUnload。它在内存不足的情况下被调用,在这里你必须清理所有破坏系统内存的东西。

Apple的UIViewController参考viewDidUnload

当内存不足的情况发生并且不需要当前视图控制器的视图时,系统可能会选择从内存中删除这些视图。此方法在视图控制器的视图被释放后调用,这是您执行任何最终清理的机会。

二、看看这个教程,ARC解释的很好

于 2012-07-04T19:59:15.267 回答
0

您是[[NSNotificationCenter defaultCenter] removeObserver:self];从您的视图控制器子类之一调用吗?如果是这样,那就可以解释为什么您没有调用 viewDidUnload 。

如果这是问题所在,您应该在需要时将自己从特定通知中删除,而不是如上所述的所有通知。(不过,可以从 dealloc 调用removeObserver:self。)

于 2012-07-05T01:37:14.147 回答
0

如果我在 viewDidDisappear 中将 IBOutlets 设置为 nil 而不是 viewDidUnload 可以吗?

这种说法有很多错误之处。

首先,您不要将 IBOutlets 设置为 nil viewDidDisappearviewDidDisappear当视图“消失”时被调用(例如,当它在标签栏控制器中时,你切换到另一个标签;或者它在导航控制器上,你在它上面推了一些东西);然后视图可以再次“出现”而无需再次加载。如果您将 IBOutlets 设置为 nil,则在您出现时它们将不会再次设置。(它们仅在加载视图时设置。)

其次,如果你有泄漏,并且将东西设置为 nil “修复它”,这意味着你没有释放实例变量。您必须始终释放dealloc.

我什至在 viewDidUnload 方法中放了一个日志代码。但是当我什至弹出到 rootViewController 时,它似乎没有被调用!

是的,viewDidUnload仅在内存不足的情况下调用。在大多数情况下通常不会调用它。如果您依赖它被调用,那么您使用了错误的方法。

于 2012-10-31T00:19:49.117 回答