Я получил эту процедуру для загрузки async изображения, проблема в том, когда я освобождаю объект lBitmap, если я освобожусь, я получил AV сверху, но мне нужно освободить его, потому что выделенная память. Как я могу освободить объект LBitmap?Ошибка освобождения объекта внутри потока
procedure LoadMyImage(AImage: TBitmap; AImageURL: string);
var
temp: TBitmap;
lBitmap: TBitmap;
begin
lBitmap := nil;
if FCachedImages.TryGetValue(AImageURL, lBitmap) and (lBitmap <> nil) then
begin
AImage.Assign(lBitmap);
end
else
begin
AsyncTask.Run(THttpAsyncTaskBitmap.Create(AImageURL),
procedure (ATask: IAsyncTask)
begin
TThread.Queue(nil,
procedure
begin
lBitmap := TBitmap.Create(0,0);
temp := FMX.Graphics.TBitmap.CreateFromStream((ATask as IHttpResponse).ResponseStream);
lBitmap.Assign(temp);
FCachedImages.AddOrSetValue(AImageURL, lBitmap);
AImage.Assign(temp);
temp.Free;
lBitmap.Free; //---> if i free the object i got AV on top
end);
end);
end;
end;
Мобильный компилятор использует модель памяти ARC. Это означает, что все объекты подсчитываются и автоматически удаляются, когда количество ссылок равно нулю. –
В ARC, вызывая 'Free()' просто нуль эту переменную, удаляя эту ссылку из объекта и уменьшая ее количество ссылок. Объект фактически не освобождается, пока все ссылки не будут удалены. –
См. [Threaded Web Image Loader Class для Delphi XE5 Firemonkey] (http://www.fmxexpress.com/threaded-web-image-loader-class-for-delphi-xe5-firemonkey/). –