Вы не можете освободить переменную, вы можете только освободить/уничтожить объект.
Итак, когда в вашем коде вы вызываете
MyObject.Free();
На самом деле вы уничтожаете объект, на который ссылается переменная MyObject
. И это тот же объект, на который ссылается/указывает ваша переменная myObj.
И причина, по которой они оба указывают на один и тот же объект, заключается в том, что когда вы вызывали
myObj:= MyObject;
вы просто скопировали данные, используемые вашей программой для ссылки на этот объект, из переменной mObj в переменную MyObject.
Вы видите, что в Delphi/Object Pascal есть два типа переменных. Ссылочные и нессылочные переменные.
Переменные без ссылок — это простые переменные, например, целые числа. Они прямо указывают на область памяти, содержащую их данные. И их размер точно такой же, как размер блока памяти, на который они указывают.
Ссылочные переменные, которые являются переменными, ссылающимися на классы, интерфейсы или строки, отличаются. Вместо указания непосредственно на блок памяти, содержащий объект, они указывают на специальную ссылку на этот объект (экземпляр). Затем эта ссылка фактически содержит информацию о том, где в памяти находится этот объект и насколько он велик.
Основное преимущество ссылочных переменных заключается в том, что вы можете иметь несколько ссылочных переменных, ссылающихся на один и тот же объект. Это особенно полезно, когда у вас разные имена этих переменных в разных частях кода.
Но их главный недостаток заключается в том, что вам нужен надлежащий механизм, чтобы убедиться, что память, содержащая объект, на который они ссылаются, освобождается в нужное время. Вот почему вам нужно вызвать MyObject.Free
или MyObject.Destroy
, чтобы эта память была освобождена.
Теперь, в случае использования расширенных ссылок, вам не нужно самостоятельно вызывать деструктор объектов, поскольку ARC содержит собственный механизм для определения того, когда определенный объект больше не нужен и может быть освобожден (счетчик ссылок достигает нуля).
В своем вопросе вы заявляете, что хотите, чтобы ваша глобальная переменная больше не указывала на ваш объект, но при этом ваша локальная переменная указывала на этот объект.
Я предполагаю, что есть две возможные причины этого:
Во-первых, вы можете захотеть, чтобы ваш глобальный объект ссылался на другой объект, сохраняя при этом ссылку на старый объект в локальной области. Для этого вы можете просто присвоить новую ссылку на объект вашей глобальной объектной переменной.
MyGlobalObject := SomeNewObject;
or
MyGlobalObject := TSomeObject.Create;
во-вторых, вы можете захотеть, чтобы ваша глобальная объектная переменная больше не ссылалась на какой-либо действительный объект. В этом случае вам нужно только установить его в специальное состояние nil
MyGlobalObject := nil;
В любом случае, в любом случае убедитесь, что перед изменением переменной глобального объекта у вас есть хотя бы одна другая переменная, ссылающаяся на этот объект. Почему?
Потому что, если вы измените свою последнюю переменную, указывающую на какой-то объект, чтобы она указывала на какой-то другой объект или вообще ни на что, вы теряете способность взаимодействовать и освобождать память исходных объектов. В терминологии программирования такие сценарии называются утечками памяти.
person
SilverWarior
schedule
02.01.2016
myObj:= MyObject
, обе переменные станут одним и тем же объектом. Итак, когда вы вызываетеMyObject.Free()
после этого, переменнаяmyObj
также освобождается. Итак, я не могу понять, почему вы пытаетесь освободить объектMyObject
, если хотите использовать его данные дальше в коде? - person ankhzet   schedule 02.01.2016