Перейти к содержанию
Fire Monkey от А до Я
  • 0

Освобождение TFDQuery


uuxyyz

Вопрос

Коллеги добрый день. Кто-нибудь проверял, как дела с TFDQuery.Free в мобильных ОС?

У меня по факту:

После создания объекта (после вызова inherited Create) refcount 5 (работаем с Owner = nil)

перед вызовом Free  - 5, соответственно деструктор не вызовется!

 

DisposeOf не спасает, т.к на каждый запрос создается свой экземпляр объекта TFDQuery, через некоторое время IOS нас вырубает за исчерпание страниц, ну беда... 

Бегло посмотрел код FireDac и Data.DB, вроде везде стоит Weak, но блииннн:

type
  TFDLockedQuery = class(TFDQuery)
...
constructor TFDLockedQuery.Create(ALock: TMutex);
begin
  inherited Create(nil);
  // уже тут refcount 5!!! 
end;

Как рушить то его?, решал кто нибудь?

(UPD)PS: Речь идет о DelphiXE7 upd2

Изменено пользователем uuxyyz
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Немного не понял почему может не спасать DisposeOf, метод же 100% вызывает деструктор класса.

Абсолютно верно, деструктор он вызывает, но память будет освобождена только когда refcount объекта опустится до ноля. Т.е при вызове DisposeOf программа проживет дольше и часть памяти будет отдано назад но не вся!

Ссылка на комментарий
  • 0

DisposeOf разрушит у объекта внутренние связи, которые как раз и накручивают рефкаунт. После DisposeOf обнулите все ссылки которые вы создали на объект сами и все должно быть ок.

ReportMemoryLeaksOnShutdown := True;

Так проверьте.

Изменено пользователем xenon54
Ссылка на комментарий
  • 0

да

 

DisposeOf разрушит у объекта внутренние связи, которые как раз и накручивают рефкаунт. После DisposeOf обнулите все ссылки которые вы создали на объект сами и все должно быть ок.

ReportMemoryLeaksOnShutdown := True;

Так проверьте.

Для android и IOS как мне видится это не работает, а если и рабоатет то ничего не показывает, хотя логи IOS говорят об обратном. В виндах с учетом специфики деструкторов - все в норме... 

Ссылка на комментарий
  • 0

Ярослав писал уже о RefCount'е, почему он такой. Внутри объекта FD есть ссылки на самого себя. Даже проверка самого рефкаунта накидывает +1 к нему. А что касается Create(nil) так у всех компонентов owner = week. DisposeOf + nil всех ваших ссылок должно хватать, если вы уверены что утечка именно в этом компоненте, то либо вы где-то не удаляете ссылку, либо один из деструкторов в цепочке компонента FD кривой.

Ссылка на комментарий
  • 0

Вести с полей, для интересующихся, сочувствующих и сомневающихся. 

Простой пример, форма с FDConn, FDQuery и сапортов в составе FDPhysSQLiteDriverLink и FDGUIxWaitCursor. У всех все по-умолчанию. 

Таблица вида:

CREATE TABLE `Files` (
`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
`OwnerID` INTEGER NOT NULL,
`Owner` TEXT NOT NULL,
`Version` INTEGER NOT NULL,
`Name` TEXT NOT NULL,
`Name` TEXT NOT NULL,
`Size` INTEGER NOT NULL,
`BeginDWTime` INTEGER NOT NULL,
`EndDWDate` INTEGER NOT NULL,
`isDWComplete` INTEGER NOT NULL,
`isInstalled` INTEGER NOT NULL,
`DCP` TEXT NOT NULL,
`BCP` TEXT NOT NULL,
`RP` TEXT NOT NULL,
`isDA` INTEGER NOT NULL,
`Rank` INTEGER NOT NULL,
`ServerID` INTEGER NOT NULL
);

FDQuery.SQL.Text = 'SELECT * FROM Files' В таблице 697 записей.

 

Код:

var
  i: Integer;
begin
  for i := 0 to 999 do
  begin
    FDQuery.Open;
    try

    finally
      FDQuery.Close;
    end;
  end;

Дает и не освобождает 7 мб. памяти в ос Андройд... в iOS потери еще больше!

Ссылка на комментарий
  • 0

А как вы определяете факт неосвобождения памяти?

Какими инструментами пользуетесь?

в IOS логами, т.к у меня iOS 8.1 на нем не пашет debug server с последним X-Code. iOS выкидывает приложение с причной LargestProcess и 177 тысячами захваченных страниц.

В androide тупо диспетчером задач... 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...