gpt4 book ai didi

ios - 第二次分配属性时是否立即释放对象?

转载 作者:行者123 更新时间:2023-11-29 01:24:57 27 4
gpt4 key购买 nike

我正在开发一个应用程序,使用 AVAudioplayer 呈现 100 个句子。我不想拥有 100 个 AVAudioplayer 对象,而是只想拥有一个属性并动态更改与其关联的对象。我的代码归结为以下内容(尽管在实际代码中这些行并不是紧接着彼此的):

self.thePlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url1 error:&error]; 
self.thePlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url2 error:&error];

当 thePlayer 被分配并用 url2 再次初始化时,用 url1 初始化的对象是否会被释放,或者这两个对象仅在 View 关闭时才被释放?当我处理 100 个声音文件时,我不希望它们全部保留在内存中。我正在使用 ARC

提前致谢

最佳答案

在您的特定情况下,猜测您的代码可能包含什么,对象可能会在您希望的时候被释放。这是很多“猜测”、“可能”和“可能”。您确实需要了解内存管理的工作原理才能对其进行推理。

如果 AVAudioPlayer 被其他任何东西强引用,那么在这些强引用消失之前它不会被释放。换句话说,设置 thePlayer 不会释放播放器(如果其他东西对播放器有强引用)。 (那个“东西”可能是系统框架的一部分,在极少数情况下甚至可能是它本身。它不一定是你的代码。)

如果 AVAudioPlayer 有挂起的 autorelease 调用,那么它不会被释放,直到自动释放池耗尽(通常在事件循环结束时,基本上意思是“当你的 UIKit 调用的方法返回时。”)例如,如果你在循环中创建大量对象并立即将它们丢弃,它们可能会或可能不会被释放,直到自动释放池耗尽。同样,自动释放可能由系统框架注入(inject)。实际上,这意味着对象通常会“很快”(几分之一秒)释放,但不一定立即释放。您可以使用 @autoreleasepool block 更快地清理自动释放的对象,如果您在循环中创建许多临时对象,有时需要这样做。这并不经常需要。

但是对于一阶近似,在许多最常见的情况下,是的,替换属性将自动并立即释放先前的对象。

关于ios - 第二次分配属性时是否立即释放对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34119114/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com