TMediaplayer 在文件播放前因 ARC 而被释放
TMediaplayer gets Freed because of ARC before file plays
这里是一个 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 析构函数被调用。
您的 Med
变量在过程退出时超出范围,因此 ARC 在此时清理它是有意义的。
您应该在其他地方定义您的变量,也许在您的表单中。
当所有者被释放时,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 平台。
这里是一个 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 析构函数被调用。
您的 Med
变量在过程退出时超出范围,因此 ARC 在此时清理它是有意义的。
您应该在其他地方定义您的变量,也许在您的表单中。
当所有者被释放时,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 平台。