我正在使用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];
它说:将保留对象分配给弱变量
答案 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
仅在内存不足的情况下调用。在大多数情况下,它不会正常调用。如果您要依赖它,那么您使用的是错误的方法。