- 0
Динамическое удаление объектов и форм (опять...)
Ответ от
gonzales
-
Последние посетители 0 пользователей онлайн
Ни одного зарегистрированного пользователя не просматривает данную страницу
Ответ от
gonzales
Ни одного зарегистрированного пользователя не просматривает данную страницу
Доброго времени суток!
Знаю, что тема поднималась 100500 раз, сам писал в них, но тем не менее...
После перехода на 10.4 стал замечать, что приложение на мобильных платформах стало частенько зависать или выдавать сообщения External Exception xx. Стал разбираться и заметил, что такое поведение часто происходит после уничтожения объектов или форм. Прогуглив тему динамического удаления объектов нашел информацию вот такого характера
Now, that being said, in RAD Studio 10.4, Embarcadero has removed object ARC handling completely, going back to the traditional memory management model (which they now refer to as "Unified Memory Management"). In which case,
TObject.Free()
andFreeAndNil()
now behave the same as they always have on non-mobile platforms, but now on all platforms equally. So your original code will now work as expected, you do not need to switch toTObject.DisposeOf()
in 10.4 onwards (though, you can if you want to, it will behave exactly likeTObject.Free()
, and give you the desired effect if you need to support 10.3 and earlier).То есть, если я правильно понимаю, Эмба отказалась от ARC и вернулась к традиционной модели управления памятью. И теперь нужно обратно вернуться к TObject.Free(), еще компилятор стал ругаться, что метод Release помечен, как deprecated - то есть в скором времени исчезнет. В связи с этим два вопроса
1. Может ли конструкция r.DisposeOff; r:=nill; приводить к зависанию программы? Нужно ли теперь заменить все на r.Free;
2. Как теперь удалить форму, кликнув на кнопку, которая расположена на этой форме?
procedure TForm30.BlackRectClick(Sender: TObject); begin form1.BlackRect.Visible := false; Form30.Close; //Form30.Free; Form30.Release; end;
Такая конструкция работает, но часто программа зависает
procedure TForm30.BlackRectClick(Sender: TObject); begin form1.BlackRect.Visible := false; Form30.Close; Form30.Free; //Form30.Release; end;
Такая конструкция крашит программу, но это и понятно, удаляем сук, на котором сидим. Но если Release перестанет работать, как тогда удалить форму?
Поделиться сообщением
Ссылка на сообщение