TObject (Free, FreeAndNil, InitInstance, NewInstance, class) |
Автор megabax | |||||||||
26.07.2009 г. | |||||||||
TObject (Free, FreeAndNil, InitInstance, NewInstance, class)Продолжим рассматривать методы класса TObject. Изучим метод Free:
По сути, это тот же деструктор, только он проверяет самого себя на пустой указатель. Многие рекомендуют использовать Free вместо Destroy. Хотя на самом деле это без разницы, потому что реально при уничтожении объекта указатель на него не обнуляется, и такая проверка не спасает от повторной попытки уничтожения объекта. Даже если мы напишем вот такой класс
Все рано, обнуление не будет происходить, так как после вызова inherited Free; команда self:=nil; уже не выполняется. Для того, что бы после уничтожения объекта указатель обнулялся, используйте объявленную в модуле SysUtils процедуру FreeAndNil. Вот как она реализована:
Сперва происходит копирование указателя во временную переменную. Затем обнуляется сам указатель объекта и только после этого через временную переменную происходит вызов метода Free. Возникает вопрос, а почему не сделано так:
для чего такие сложности? А все дело в том, что если в деструкторе возникнет исключительная ситуация, то в во втором случае указатель так и не станет nil. Иными словами, это защита от сбоев. На прошлом уроке я приводил объявление класса TObject. Мы рассмотрели его конструктор, который ничего не делает, тоесть, в его реализации стоит заглушка. На самом же деле, при создании объекта сперва вызывается метод NewInstance, который выделяет под объект нужную область памяти, внутри него вызывается InitInstance, который заполняет поля метода NewInstance нужными полями. только после этого вызывается собственно сам конструктор, и только после него вызывается AfterConstruction - обработчик события окончания создания объекта. На момент вызова AfterConstruction объект уже создан. Давайте посмотрим, как реализован NewInstance:
Как видим, данный метод вызывает InitInstance, передав ему в качестве параметра адрес выделенной области памяти. Возвращает данная функция ссылку на созданный объект, прямо как конструктор. Кстати, заметили, что функция объявлена с модификатором class? Это значит, что она является классовой, то есть, существует независимо от того, создан объект или нет. Ее можно вызывать как обратившись к имени класса (TMyClass.MyMethod) так и к переменной объекта класса (MyObj.MyTethod). Рассмотрим пример:
* Стоит заметить, что вот такой код:
не допускается хотя в нашем примере, он, скорее всего, будет нормально работать. Но, раз на раз не приходиться. Записывая информацию в поле не инициализируемого объекта мы "портим" память компьютера, которая не выделена под этот объекта, а значит, там находиться что то другое, и рискуем вызвать глюки. Классовые методы мы можем вызывать даже если объект не инициализирован:
Но, с другой стороны, мы не можем обращается к полям объекта внутри классового метода, так как этот метод может быть вызван даже тогда, когда объект класса еще не создан. Если мы попробуем обратится в классовом методе к полям объекта, то при компиляции будет выдано сообщение об ошибке: Instance variable ... inaccessible here. На этом я закончу урок, а в следующий раз мы продолжим изучение методов TObject. Скриншоты, помеченные знаком * , являются цитатами и иллюстрациями программного продукта "Delphi", авторское право на который принадлежит "Borland Software Corporation".
|
|||||||||
Последнее обновление ( 18.05.2013 г. ) |