Вот как я это вижу:
Примитивные типы (как целое, вещественное, двойной, расширенный), массивы, наборы, записи: они автоматически уничтожаются при выходе из области видимости.
Сводные типы (строки, типы интерфейсов, ссылки на интерфейс): они автоматически уничтожаются, когда их опорный счетчик равен нулю.
объектов из классов, которые попадают в одну из этих ситуаций: не сходит с TComponent, в список объектов, которые не реализуют права собственности или являются потомком ТСотропепЬ, но не имеет владельца, возложенные на него:
- Когда их класс сойдет с TInterfacesObject и доступны из интерфейсной ссылки: такие же поведения от типов эталонного счетчика (смотрите выше)
- других случаев: вызвать Object.Free или FreeAndNil (объект), чтобы уничтожить его вручную (в try..finally структура будет еще лучше)
Объекты, у которых есть владелец (потомки TComponent или находятся в объектах списка, реализующих право собственности): владелец возьмет их вовремя.
я заметил следующий комментарий от OP:
Я заметил понятие владельца. Тем не менее, я не смог передать свой собственный класс методу TTimer.Create(), так как это , ожидая TComponent. Почему они ограничивают вещи, которые будут использоваться только в формах ? Разве это не означает, что плохая привычка положить логику в ваши просмотров (форм)?
См, потомок ТСотропепЬ может быть зарегистрирован на паллете, чтобы иметь возможность использовать в конструкции времени (например, в форме). Но это не значит, что должен !! Вы можете передать свой пользовательский класс в TTimer.Create(), если он сходит с TComponent, но вам не нужно создавать его во время разработки - или даже быть владельцем потомка TForm (если вы хотите управлять его жизненным циклом, вам даже не нужен владелец!).
собственности представляет собой механизм, это, чтобы помочь людям сэкономить время ....
+1, если вы будете следовать «который создает, разрушает», то вы уже на 98% там. –
Но как далеко вы это делаете. Если, например, моя форма разрушает мой модельный класс, должен ли мой класс модели освобождать все свои собственные переменные? Мой нынешний работодатель говорит мне, что в моей форме FormDestroy() достаточно: fTheInstance.Destroy; Единственный XP, с которым я столкнулся с не-gb-сборником, был Cobol и Oberon, и мой инстинкт подсказывает мне, что строки недостаточно. –
об уничтожении, взятом из «Delphi в двух словах»: http://oreilly.com/catalog /delphi/chapter/ch02.html ... При освобождении объекта вы должны вызвать метод Free, а не деструктор. Различие важно, потому что Free проверяет, является ли ссылка на объект нулевой, и вызывает Destroy только для ссылок, отличных от nil. В исключительных обстоятельствах класс может переопределить метод Free ...что делает его гораздо более важным назвать Free, а не Destroy. Если вы просто вызываете разрушение на свой основной объект без объяснения причин, вы, вероятно, столкнетесь с утечками памяти. – tDo