powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Weak attribute
11 сообщений из 11, страница 1 из 1
Weak attribute
    #39640794
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я потерялся

Если я правильно понял, то [WEAK] переменные - это такие особые переменные (объекты), которые обнуляются в случае вызова деструктора где-либо. В связи с этим есть отдельный менеджер WEAK-ссылок.

Мягкие ссылки работают либо в NEXTGEN, либо в обычном компиляторе, начиная с Berlin-а.

Что я делаю не так?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
type
  TMyClass = class
  public
    [Weak] F: TObject;
  end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Instance: TMyClass;
  Obj: TObject;
begin
  Instance := TMyClass.Create;
  try
    Obj := TObject.Create;
    try
      Instance.F := Obj;
    finally
      Obj.Free;
    end;

    Caption := Format('0x%p', [Pointer(Instance.F)]); // здесь должен быть nil
  finally
    Instance.Free;
  end;
end;
...
Рейтинг: 0 / 0
Weak attribute
    #39640795
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Weak работает только в NextGen и от обычной ссылки на объект отличается тем, что не изменяет счетчик ссылок.
...
Рейтинг: 0 / 0
Weak attribute
    #39640805
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,
В берлине weak ссылки работают только с интерфейсами.
...
Рейтинг: 0 / 0
Weak attribute
    #39640813
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv-2014,

Ты уверен?
Потому что деструктор интерфейса в общем случае невозможно перехватить
Дабы зачистить Weak-ссылки
...
Рейтинг: 0 / 0
Weak attribute
    #39640840
DCC32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOU,

Мое сугубое мнение, чисто теоретически-гипотетически. Пока жива локальная переменная Obj, будет жить и адрес на неё.

Следовательно, удаляй в одной процедуре, а проверяй в другой, когда уже obj будет уничтожена


Это ведь ссылки, а значит не может удалится в пункте А пока есть в Б
...
Рейтинг: 0 / 0
Weak attribute
    #39640879
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,
Уверен. Никто деструктор не перехватывает. Сделано через магические процедуры.
...
Рейтинг: 0 / 0
Weak attribute
    #39640880
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,
Да и не зачищают они weak ссылки. При ссылке на переменную со слабой ссылкой, счетчик не увеличивается.
А указатель может оставаться не очищенным.
...
Рейтинг: 0 / 0
Weak attribute
    #39640942
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понимаю

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
type
  TMyClass = class
  public
    [Weak] I: IInterface;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Context: TRttiContext;
  RttiType: TRttiType;
  Fields: TArray<TRttiField>;
  Field: TRttiField;
  Attributes: TArray<TCustomAttribute>;
begin
  Context := TRttiContext.Create;
  RttiType := Context.GetType(TMyClass);
  Fields := RttiType.GetFields;
  Field := Fields[0];

  Attributes := Field.GetAttributes;
  Caption := Field.Name + '  attributes: ' + IntToStr(Length(Attributes));
end;



Атрибутов нет
...
Рейтинг: 0 / 0
Weak attribute
    #39641025
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,
Потому что надо так:
Код: pascal
1.
2.
3.
4.
5.
6.
  {$M+}
  TMyClass = class
  public
    [Weak] I: IInterface;
  end;
  {$M-}
...
Рейтинг: 0 / 0
Weak attribute
    #39641055
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте соотнесём наши знания о Weak-ссылках

Судя по System._FinalizeRecord, под Weak логику подпадает 3 типа:

1. TObject
- дифайн WEAK INST REF
- присвоение InstWeakCopy --> RegisterWeakRef --> добавить ссылку из хеш таблицы
- очистка InstWeakClear --> UnregisterWeakRef --> удалить ссылку из хеш таблицы
- в деструкторе TObject/TInterfacedObject --> CleanupInstance --> TInstHashMap.Destroy --> TInstItem.ClearWeakRefs --> обнулить все поля, связанные с ссылкой

2. function of object
- дифайн WEAK INST REF
- присвоение CopyClosure --> RegisterWeakMethodRef
- очистка ClosureRemoveWeakRef --> ClosureRemoveWeakRef

3. IInterface
- дифайн WEAK INTF REF
- присвоение --> InstWeakCopy --> RegisterWeakRef
- очистка --> InstWeakClear --> UnregisterWeakRef

Получается, мягкие ссылки - это не просто переменные, которые инициализируются обычным указателем. Это сложный указатель, который обнуляется при деструкторе и оригинального объекта.
...
Рейтинг: 0 / 0
Weak attribute
    #39641398
527470
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOU,

судя по этой ссылке: Conditional_compilation weak не работает на винде от слова совсем (максимум просто не увеличивают счетчик у интерфейса, как у const параметра функции).
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Weak attribute
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]