После итерации моего списка свойств в классе с использованием RTTI я сохраняю его в переменной FMap: TDictionary<TRttiProperty, TMappedField>
, а также сохраняю переменную FPropertyPK: TRttiProperty
— использую ее для сопоставления полей базы данных. После этого я плавно обращаюсь к этой TDictionary
и этой переменной в своих CRUD-функциях, в 4 проектах, где я использую этот класс, все работает отлично.
Однако я создал новый проект (эти другие были инициированы не мной), и просто после итерации, создания и добавления всего в TDictionary
, в следующей функции, которую я вызываю, у меня возникают ошибки памяти, связанные со свойствами в ней, все приходит как nil
. Но только конкретно в этом проекте, в других проектах работает тот же экран и та же функция.
Я сравнил варианты компиляции проекта один за другим и в этом новом проекте сделал все то же самое, но это не работает. В этом проекте Delphi уничтожает мою ссылку на память для всего, что связано с RTTI.
Есть решения?
Экземпляры RTTI принадлежат экземпляру TRTTIContext
. Чтобы сохранить эти экземпляры живыми, вам нужно поддерживать живой контекст.
TRttiContext
предоставляет для этого два метода класса: KeepContext
и DropContext
.
Поэтому вам нужно вызвать TRttiContext.KeepContext
перед добавлением этих экземпляров в словарь и вызвать TRttiContext.DropContext
, когда словарь будет уничтожен.
Также убедитесь, что словарь не берет на себя ответственность за эти экземпляры.
Что касается закрытия из-за отсутствия деталей отладки: симптом использования уничтоженных экземпляров описан достаточно ясно, чтобы дать подсказку об основной причине. Я не понимаю, какую пользу принесет более подробная информация. Знаний о принадлежности объектов RTTI достаточно, чтобы дать правильный ответ на этот вопрос.