2015-07-29 3 views
1

Я получил эту процедуру для загрузки 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; 
+1

Мобильный компилятор использует модель памяти ARC. Это означает, что все объекты подсчитываются и автоматически удаляются, когда количество ссылок равно нулю. –

+1

В ARC, вызывая 'Free()' просто нуль эту переменную, удаляя эту ссылку из объекта и уменьшая ее количество ссылок. Объект фактически не освобождается, пока все ссылки не будут удалены. –

+0

См. [Threaded Web Image Loader Class для Delphi XE5 Firemonkey] (http://www.fmxexpress.com/threaded-web-image-loader-class-for-delphi-xe5-firemonkey/). –

ответ

3

Обычно плохой идеей использовать одну и ту же переменную в двух разных контекстах потоков, если это вам не нужно. Попробуйте создать локальную переменную области внутри процедуры завершения AsyncTask вместо использования lBitmap и temp, определенных во внешней области.

Кроме того, вы уверены, что вам нужны как temp, так и lBitmap в обработчике обработки задачи async? Я бы сказал, что вам должно быть хорошо с temp, и не забудьте определить его локально.