在文件播放之前,TMediaplayer因为ARC而获得了Freed

时间:2015-11-27 14:00:18

标签: 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;时,引用计数降为0并调用TMediaPlayer析构函数。

2 个答案:

答案 0 :(得分:4)

当程序退出时,您的<?php $portfolio_categories = get_categories(array('taxonomy'=>'portfolio_category')); ?> <?php if ($portfolio_category != $prev_portfolio_category): ?> <?php if ($portfolio_category = 'category1'): ?> <figure>1</figure> <?php else: ?> <figure>2</figure> <?php endif; ?> <?php endif; ?> <?php $prev_portfolio_category = $portfolio_category; ?> 变量超出了范围,因此ARC在此时清理它是有道理的。

您应该在其他地方定义您的变量,也许在您的表单中。

答案 1 :(得分:4)

当释放所有者时,将释放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平台。