Показать сообщение отдельно
  #2  
Старый 28.03.2012, 17:12
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Интерфейсы в Дельфи - это объекты с управляемым временем жизни.
То есть с переменными любого типа, отнаследованого от TInterface, Дельфи поступает так.

1) если в процедуре описана переменная интерфейсного типа, то перед первым оператором процедуры эта переменная получает значение Nil;
2) у каждого объекта, реализующего какой-нибудь интерфейс обязательно должны быть две функции - AddRef и Release. Как правило, объект при вызове AddRef должен увеличить внутренний счётчик, при вызове Release - уменьшить. Если при этом значение счётчика станет равным нулю, то объект вызывает свой деструктор. То есть правильно реализованый COM-объект сам следит за своим временем жизни.
Теперь синтаксический сахар
3) если A - переменная интерфейсного типа, а Exp - некое выражение, вырабатывающее интерфейс (переменная или вызов функции), то за оператором присваивания
Код:
 A:=Exp; 
стоит примерно такая процедура
Код:
 
  if A<>Nil then A.Release(); // этот код Дельфи добавляет сама
  A:=Exp; 
  if A<>Nil then A.AddRef(); // этот код Дельфи добавляет сама
4) а в конце процедуры вызываются Release для всех таких переменных
5) кроме того, если в Record-е есть поля интерфейсного типа, то инициализация и финализация применяется и к ним.

Что бы избавиться от интерфейса, достаточно переменной присвоить nil.

То есть если не использовать явные приведения к Pointer и не использовать move и ему подобные ухищрения, то Дельфи всё сделает за Вас.
Удачи
Ответить с цитированием