ios - TMediaplayer 在文件播放前因 ARC 而被释放

标签 ios delphi automatic-ref-counting firemonkey

这是一个 TMediaplayer 播放文件的例子

var
    Med : TMediaplayer;
begin
  Med := TMediaPlayer.Create(self);
  Med.FileName := TPath.Combine(TPath.GetDocumentsPath, 'sound.caf');
  Med.Play;
end;

文件播放,但因为我给它一个所有者,所以我创建了一个引用,引用计数增加,并且永远不会调用析构函数,因此它永远不会被释放,并且内存泄漏。

如果我在没有所有者的情况下创建它

Med := TMediaPlayer.Create(nil);

当我到达 end; 时,refcount 降为 0,TMediaPlayer 析构函数被调用。

最佳答案

当所有者被释放时,TMediaPlayer 实例将被释放。如果您想手动释放 TMediaPlayer 实例,则必须 DisposeOf 该实例。

要知道该实例的引用,您必须将引用存储到本地字段中。

type
  TSomeForm = class( TForm )
  private
    FMediaPlayer: TMediaPlayer;
    procedure PlaySomeSound();
  end;

procedure TSomeForm.PlaySomeSound();
begin
  // force destruction for ARC/NONARC platforms
  FMediaPlayer.DisposeOf(); // this is also safe, if FMediaPlayer is nil
  FMediaPlayer := TMediaPlayer.Create( Self );
  FMediaPlayer.FileName := TPath.Combine(TPath.GetDocumentsPath, 'sound.caf');
  FMediaPlayer.Play;
end;

此代码适用于 ARC 和 NONARC 平台。

关于ios - TMediaplayer 在文件播放前因 ARC 而被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33959002/

相关文章:

ios - iOS 上的启动画面有问题?

iphone - 优势iOS企业帐户和标准帐户之间有什么区别?

ios - 显示覆盖整个 UITableView 的标签

c++ - 如何使用 TIdHTTPProxyServer 重定向 Post 请求

sockets - Windows服务中的Indy UDP Server无法监听

iOS:对 View Controller 的所有对象使用弱?

iphone - 当CGPointMake遇到大数目时

C# 2010 未加载 delphi DLL

iphone - 如何为非 ARC 项目中的文件启用 ARC?

Swift 类在作用域结束时取消初始化,而不是在上次使用后取消初始化