接收内存警告和内存泄漏

时间:2012-07-04 17:04:50

标签: ios iboutlet uipageviewcontroller didreceivememorywarning

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

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

如下:

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

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

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

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

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

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

4 个答案:

答案 0 :(得分:2)

您无需在viewDidUnload中取消这些值。确保使用弱属性而不是强属或为IBOutlet分配。收到内存警告并不一定意味着你正在泄漏。收到内存警告意味着您的应用占用了太多内存。运行仪器并根据应用程序使用的内存编辑您的问题。

你正在使用AVAudioPlayer的事实让我觉得你可能正在将一些大量的音频文件下载到内存中。

顺便说一下,initWithContentsOfURL:error:会让你从App Store中被拒绝,因为你正在阻止主线程。尝试在仅支持手机功能的iPhone上测试您的应用,然后进入您的办公室/房屋中连接不良的部分。也可以尝试将手机切换到飞行模式。毫无疑问,你的应用程序要么在连接失败之前冻结很长时间,要么就会崩溃。

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

答案 1 :(得分:2)

首先,请勿在{{1​​}}中将属性设置为nil,因为您的视图仍然已加载。您必须始终在viewDidDisappear中将它们设置为nil。它是在内存不足的情况下调用的,在这里你必须清除所有破坏系统内存的东西。

Apple的UIViewController reference用于viewDidUnload

  

当出现内存不足的情况和当前视图控制器时   如果不需要视图,系统可能会选择从中删除这些视图   记忆。在视图控制器的视图之后调用此方法   已经发布,你有机会进行任何最后的清理工作。

其次,请看一下本教程,其中解释得非常好ARC

答案 2 :(得分:0)

您是否从某个视图控制器子类调用[[NSNotificationCenter defaultCenter] removeObserver:self];?如果是这样,那就解释了为什么你没有调用viewDidUnload。

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

答案 3 :(得分:0)

  

如果我在viewDidDisappear中将IBOutlets设置为nil,那是否可以   viewDidUnload?

这句话有很多不妥之处。

首先,你没有在viewDidDisappear中将IBOutlets设置为nil。视图“消失”时会调用viewDidDisappear(例如,当它位于标签栏控制器中时,您切换到另一个标签页;或者它位于导航控制器上,并且您可以在其上推送一些内容);然后视图可以再次“显示”而无需再次加载。如果将IBOutlets设置为nil,则在出现时不会再次设置它们。 (它们仅在加载视图时设置。)

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

中释放保留的实例变量
  

我甚至在viewDidUnload方法中放了一个日志代码。但事实并非如此   当我甚至弹出到rootViewController时似乎被调用了!

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

相关问题