我正在开发一个应用程序,我使用AVAudioplayer呈现100个句子。我不想拥有100个AVAudioplayer对象,而只想拥有一个属性并动态更改与之关联的对象。我的代码归结为以下内容(尽管实际代码中的行不会紧随其后):
self.thePlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url1 error:&error];
self.thePlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url2 error:&error];
使用url1初始化的对象是否在分配了Player并使用url2第二次初始化时释放,或者这两个对象仅在视图被解除时释放?当我处理100个声音文件时,我不希望它们都在内存中。我正在使用ARC
提前致谢
答案 0 :(得分:1)
在您的特定情况下,猜测您的代码可能包含的内容,对象可能会在您希望它们被释放时释放。那是很多人猜测的," "有可能的,"和#34;可能。"你真的需要了解内存管理的工作原理以便进行推理。
如果AVAudioPlayer
被其他任何东西强烈引用,那么它就不会被释放,直到那些强引用消失为止。换句话说,设置thePlayer
如果其他人有强烈的引用,则不会取消分配玩家。 (那些"某些东西"可能是系统框架的某些部分,甚至在某些极少数情况下本身。它不一定是你的代码。)
如果AVAudioPlayer
对其进行了暂挂autorelease
调用,那么它将无法释放,直到自动释放池耗尽(通常在事件循环结束时,这基本上意味着&#34 ;当你的UIKit调用的方法返回时。")例如,如果你在一个循环中创建了大量的对象并立即抛弃它们,它们可能会或可能不会被解除分配,直到自动释放池耗尽。同样,自动释放可以由系统框架注入。在实践中,这意味着该对象通常会被释放,并且很快就会被解除分配。 (在一小部分时间内),但不一定立即。您可以使用@autoreleasepool
块更快地清理自动释放的对象,如果在循环中创建许多临时对象,有时这是必需的。这不是经常需要的。
但是对于一阶近似,在许多最常见的情况下,是的,更换属性将自动并立即释放前一个对象。
答案 1 :(得分:0)
显示你如何声明thePlayer会很有用。如果它们被正确合成,则将自动处理存储器管理。看来你正在使用" self"访问thePlayer,如果是这样,你将通过setter / getter设置值,并为你处理内存管理。但我也注意到了#34; Self"是大写的,不应该是为了正确使用setter / getter。有关合成变量的更多信息,请查看:What exactly does @synthesize do?。请注意,在某些地方您不应该使用自我,此链接会讨论:How does an underscore in front of a variable in a cocoa objective-c class work?。