Система, над которой я работаю, создала собственный блок подсчета ссылок, но он конфликтует с Delphi. Я пытался сделать его совместимым с условиями компилятора, но все еще натыкался на несколько ошибок, которые, как я думаю, могли быть вызваны тем, что ARC все еще включен.
Как отключить автореферанс в Delphi XE7?
Ответы (1)
Просто вы не можете глобально отключить ARC компилятора Delphi на платформах, где он поддерживается (в настоящее время Android и iOS).
Однако ARC можно обойти в коде для определенных ссылок.
Компиляторы ARC вводят атрибуты [weak]
и [unsafe]
.
[weak]
можно использовать для пометки слабых ссылок, которые не участвуют в подсчете ссылок, но вам все равно потребуется хотя бы одна сильная ссылка, чтобы поддерживать объект в рабочем состоянии. Слабые ссылки также устанавливаются в nil
при уничтожении объекта.
[unsafe]
можно использовать для полного отключения подсчета ссылок для конкретной ссылки, но он предназначен для использования в редких случаях и запрещает вам смешивать подсчитываемые и не подсчитываемые ссылки, что приводит к очень ограниченному использованию.
Кроме того, параметры, объявленные как const
и var
, не учитываются.
ARC в мобильных компиляторах Delphi
const
и var
, не учитываются. Переменные объекта, объявленные как [weak]
, не учитываются при подсчете ссылок (хотя они отслеживаются для автоматического обнуления). В тех случаях, когда [weak]
нежелательно/осуществимо, вы можете просто прибегнуть к Pointer
приведению типов к заданиям. Конечно, Free()
/FreeAndNil()
больше не будет работать, вам придется вызывать Destroy()
/DisposeOf()
напрямую. Не идеальное решение, но в некоторых случаях может оказаться полезным.
- person Remy Lebeau; 13.03.2015