我使用ARC构建了一个相当简单的应用程序。但是,我遇到了内存不足,但我无法弄清楚导致它的原因。由于我无法澄清导致它的原因,我有一些具体细节和问题。
当我尝试加载新的View Controller时出现问题。此视图控制器托管了许多图像,加载后,将在我拥有的单个类中为AVAudioPlayer
添加3-4分钟的音频文件。
按下视图控制器并弹出8-10次时会出现问题。弹出视图控制器后,我在stop
上调用AVAudioPlayer
并将所有相关对象(包括AVAudioPlayer
实例)返回为零。
我真的不明白什么可能导致内存泄漏,或者其他什么可能破坏设备内存,但我确实有一些具体的问题。
当停止AVAudioPlayer
时,是否仍允许在内存中正确释放?
调用AVAudioPlayer
后将stop
指针设置为nil会阻止系统从设备内存中释放某些数据吗?
当所有者被解除分配时,不应发布ARC中的任何内容(我在询问我的UIViewController
中从弹出堆栈弹出的所有视图和数据)?
我应该知道ARC中的AVFoundation
或AVAudioPlayer
是否有任何问题?
调用stop
以错误的方式结束音频会话/让它被释放?
编辑:我已经开始使用仪器工具来跟踪我的分配和泄漏。工具没有任何内存泄漏,但应用程序将崩溃,几乎与实时字节无关。当使用的总RAM超过200MB(210-230MB - 我的设备有256MB RAM)时,应用程序将崩溃。我的新问题是分配的总字节数(即使它们不是活的)会影响内存崩溃吗?如果是这样,我该如何防止这种情况?
Here是一个崩溃的运行图像。你可以在最后看到一堆内存警告。
答案 0 :(得分:5)
问)视图控制器被按下并弹出8-10次时会出现问题。当弹出视图控制器时,我在AVAudioPlayer上调用stop并将所有相关对象(包括AVAudioPlayer实例)返回到nil。 A)添加一个dealloc方法并记录dealloc,所以你知道什么都没有保留那些,然后在控制台中查找这些:
- (void)dealloc
{
NSLog(@"MySpecialViewController getting dealloced!");
}
如果您没有看到这些内容正在保留此对象 - 可能是委托。
问:我真的不明白什么可能导致内存泄漏,或者还有什么可能破坏设备内存,但我确实有一些具体问题。 A)你应该在Instruments(和Leaks)中使用ObjectAlloc。这些非常容易使用 - 在模拟器中使用它们运行项目,只需使用默认值,您将立即获得大量有用的信息。你可以看到泄漏的东西应该真正有用。问)当停止AVAudioPlayer时,是否仍允许在内存中正确释放? A)不可以。你必须将强大的ivar / property设置为nil(你说你正在做)。我刚检查过,AVAudioPlayer没有保留委托。这就是说,作为一般规则,当我关闭它的任何东西时:
[something stop/cancel/etc];
something.delegate = nil;
something = nil;
调用stop后将AVAudioPlayer指针设置为nil是否会阻止系统从设备内存中释放某些数据?
问:在所有者被解除分配时,不应该释放任何东西(我要问我的UIViewController中的所有视图和数据是否从堆栈中弹出)? A)如果唯一保留ViewController的东西,例如navigationController的viewControllers数组,那么是的,你的viewController子类应该被释放,所有强大的属性和ivars也将被释放。
问)我应该知道ARC中的AVFoundation或AVAudioPlayer有什么问题吗? A)我不知道,因为这是一个受欢迎的课程,所以期待你的问题在你的代码中。
问)呼叫是否以错误的方式结束音频会话/让它被释放? A)如果是我:
[avPlayer stop];
avPlayer.delegate = nil;
avPlayer = nil;
编辑:如果您在应用程序运行时收到内存警告,则表示您正在泄漏或消耗大量内存。在断点处发出此警告,停止您的应用程序,并查看您的分配。我从来没有得到真实的记忆警告(我只使用ARC)
答案 1 :(得分:0)
使用ARC时很容易遇到内存问题的一个方面是你需要与后台线程中需要主线程的Cocoa Touch API进行交互。
这听起来并不像你反对这一点,但如果你开始看到不一致的行为(例如看似随机的崩溃,物体过早地超出范围等),值得投入一些努力,看看是否您正在从后台主题与Cocoa Touch进行交互。
有时来自Cocoa Touch的回调(人们可能认为会在主线程上进行回调)不是(我们在某些Game Center API中看到了这一点)。