Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Выполнение без ошибки.  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3119
_Промешан_
Каких типов? Можно пример управляемого?

Управляемые: строки, дин.массивы, интерфейсы, варианты (с ARC ещё и объекты).
29 ноя 18, 12:49    [21748432]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
alekcvp
Member

Откуда:
Сообщений: 1194
makhaon
Фэйтл Эра
пропущено...

Расскажи, пожалуйста - как это проверить?


Как ни странно: if self = nil then ... :)


Да неужели?

...

type
  TMyClass = class
    procedure Test;
  end;

procedure TMyClass.Test;
begin
  WriteLn(Integer(Self));
end;

var
  mc: TMyClass;
begin
  mc := TMyClass.Create;
  mc.Free;

  mc.Test; // <-- что тут будет напечатано?
  ...
29 ноя 18, 12:50    [21748434]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2963
FreeAndNil в помощь. Ну а любителям хранения зомби-ссылок никто уже не поможет. Ни тут ни вообще :)
29 ноя 18, 14:13    [21748585]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10638
makhaon
FreeAndNil в помощь
Не спасет от неинициализированной переменной
var
  mc: TMyClass;
begin
  mc.Test; // <-- что тут будет напечатано?
29 ноя 18, 15:30    [21748743]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5118
Фэйтл Эра
makhaon
...внутри метода можно проверить - создан ли сэлф или нет и если нет...

Расскажи, пожалуйста - как это проверить?


procedure TObject.Free;
begin
// under ARC, this method isn't actually called since the compiler translates
// the call to be a mere nil assignment to the instance variable, which then calls _InstClear
{$IFNDEF AUTOREFCOUNT}
  if Self <> nil then
    Destroy;
{$ENDIF}
end;
29 ноя 18, 16:10    [21748817]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2963
_Vasilisk_,
спасёт. если инициализировать нилом.
Квейд,
собственно, да...
29 ноя 18, 17:10    [21748896]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 197
makhaon
_Vasilisk_,
спасёт. если инициализировать нилом.
...

Каким образом неинициализированному объекту можно установить значение свойства (Self)?
29 ноя 18, 21:42    [21749137]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 197
Фэйтл Эра
makhaon
_Vasilisk_,
спасёт. если инициализировать нилом.
...

Каким образом неинициализированному объекту можно установить значение свойства (Self)?


Дело в том, что это "волшебное" свойство, оно является значением содержимого переменной классового типа, а не свойством экземпляра объекта. То есть, неинициализированный указатель не будет nil. И, чтобы понять, что класс не был создан, переменную класса следует сперва инициализировать нилом... как-то не очень умно? :)

Но этот фокус с self никак не поможет в случае использования алиасов (когда две переменные по дизайну указывают на один объект)

type 
  X = class
    метод;
  end;
var
  a, b : C;
...
begin
  a := C.Create();
...
  b := a; // Алиас
...
  FreeAndNil(a);
...
  b.метод; // Ничего не знает, что self теперь nil
  
29 ноя 18, 22:26    [21749178]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 318
Фэйтл Эра,

А ты не бери прямой адрес.
30 ноя 18, 00:47    [21749266]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2963
Фэйтл Эра
makhaon
_Vasilisk_,
спасёт. если инициализировать нилом.
...

Каким образом неинициализированному объекту можно установить значение свойства (Self)?


mc := nil;

рекомендую взять отладчик и посмотреть, там всё отлично видно.
30 ноя 18, 01:02    [21749270]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение без ошибки.  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2963
mc, если что, это и есть ссылка на Self. Не на класс, а на экземпляр класса.
30 ноя 18, 01:03    [21749273]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Delphi Ответить