ARC的内存问题

Ril*_*eyE 3 memory-leaks avfoundation avaudioplayer ios automatic-ref-counting

我用ARC来构建一个相当简单的应用程序.但是,我遇到了内存不足,但我无法弄清楚导致它的原因.由于我无法澄清导致它的原因,我有一些具体细节和问题.

当我尝试加载新的View Controller时会出现问题.这个视图控制器托管了许多图像,加载后,会将3-4分钟的音频文件添加到AVAudioPlayer我拥有的单个类中.

按下视图控制器并弹出8-10次时会出现问题.当视图控制器被弹出,我叫stopAVAudioPlayer,并将所有相关对象(包括AVAudioPlayer实例)回零.

我真的不明白什么可能导致内存泄漏,或者还有什么可能破坏设备内存,但我确实有一些具体的问题.

停止时AVAudioPlayer,是否仍允许在内存中正确释放?

AVAudioPlayer调用后将指针设置为nil会stop阻止系统从设备内存中释放某些数据吗?

在ARC中,当所有者被解除分配时,我不应该发布任何东西(我要问的是我的所有视图和数据UIViewController都会从堆栈中弹出)?

是否有任何问题AVFoundationAVAudioPlayer在ARC,我应该知道吗?

是否stop以错误的方式结束音频会话/将其释放?

编辑:我已经开始使用仪器工具来跟踪我的分配和泄漏.工具没有任何内存泄漏,但应用程序将崩溃,几乎与实时字节无关.当使用的总RAM超过200MB(210-230MB - 我的设备有256MB RAM)时,应用程序将崩溃.我的新问题是分配的总字节数(即使它们不是活的)会影响内存崩溃吗?如果是这样,我该如何防止这种情况?

是一个崩溃的运行图像.你可以在最后看到一堆内存警告.

Dav*_*d H 5

问)视图控制器被按下并弹出8-10次时会出现问题.当弹出视图控制器时,我在AVAudioPlayer上调用stop并将所有相关对象(包括AVAudioPlayer实例)返回到nil.A)添加一个dealloc方法并记录dealloc,所以你知道什么都没有保留那些,然后在控制台中查找这些:

- (void)dealloc
{
  NSLog(@"MySpecialViewController getting dealloced!");
}
Run Code Online (Sandbox Code Playgroud)

如果你没有看到这些东西保留了这个对象 - 可能是一个委托.

问:我真的不明白什么可能导致内存泄漏,或者其他什么可能破坏设备内存,但我确实有一些具体问题.A)你应该在Instruments(和Leaks)中使用ObjectAlloc.这些非常容易使用 - 在模拟器中使用它们运行项目,只需使用默认值,您将立即获得大量有用的信息.你可以看到泄漏的东西应该真正有用.

Q)当停止AVAudioPlayer时,是否仍允许在内存中正确释放?A)不可以.你必须将强大的ivar/property设置为nil(你说你正在做).我刚检查过,AVAudioPlayer没有保留委托.这就是说,作为一般规则,当我关闭任何东西时:

[something stop/cancel/etc]; 
something.delegate = nil; 
something = nil;
Run Code Online (Sandbox Code Playgroud)

调用stop后将AVAudioPlayer指针设置为nil会阻止系统从设备内存中释放某些数据吗?

Q)当所有者被解除分配时,不应该发布ARC中的任何内容(我要问的是我的UIViewController中的所有视图和数据都从堆栈中弹出)?A)如果唯一保留ViewController的东西,例如navigationController的viewControllers数组,那么是的,你的viewController子类应该被释放,所有强大的属性和ivars也将被释放.

问)我应该知道ARC中的AVFoundation或AVAudioPlayer是否存在任何问题?A)我知道没有,因为这是一个受欢迎的课程,期望你的问题在你的代码中.

问)呼叫是否以错误的方式结束音频会话/让它被释放?A)如果是我:

[avPlayer stop];
avPlayer.delegate = nil;
avPlayer = nil;
Run Code Online (Sandbox Code Playgroud)

编辑:如果您的应用程序运行时收到内存警告,您正在泄漏或消耗大量内存.在断点处发出此警告,停止您的应用程序,并查看您的分配.我从来没有得到真实的记忆警告(我只使用ARC)

  • @KendallHelmstetterGelner那么为什么我现在在商店里的ARC应用程序中有数十个它们已经有3个月?应用仍然可以获得dealloc - 最后一分钟清理.你不能做的是"[super dealloc];" (5认同)