Как отключить автореферанс в Delphi XE7?

Система, над которой я работаю, создала собственный блок подсчета ссылок, но он конфликтует с Delphi. Я пытался сделать его совместимым с условиями компилятора, но все еще натыкался на несколько ошибок, которые, как я думаю, могли быть вызваны тем, что ARC все еще включен.


person Friso    schedule 13.03.2015    source источник
comment
Это продолжает тему ваших недавних вопросов, где вы, кажется, боретесь против системы. Продолжайте использовать AnsiString. Отключить АРК. Я думаю, вам будет лучше, если вы попытаетесь плыть по течению, а не плыть против течения.   -  person David Heffernan    schedule 13.03.2015
comment
Ты прав. Я также работаю над альтернативами, но было бы неплохо, если бы я мог повторно использовать уже существующий код.   -  person Friso    schedule 13.03.2015


Ответы (1)


Просто вы не можете глобально отключить ARC компилятора Delphi на платформах, где он поддерживается (в настоящее время Android и iOS).

Однако ARC можно обойти в коде для определенных ссылок.

Компиляторы ARC вводят атрибуты [weak] и [unsafe].

[weak] можно использовать для пометки слабых ссылок, которые не участвуют в подсчете ссылок, но вам все равно потребуется хотя бы одна сильная ссылка, чтобы поддерживать объект в рабочем состоянии. Слабые ссылки также устанавливаются в nil при уничтожении объекта.

[unsafe] можно использовать для полного отключения подсчета ссылок для конкретной ссылки, но он предназначен для использования в редких случаях и запрещает вам смешивать подсчитываемые и не подсчитываемые ссылки, что приводит к очень ограниченному использованию.

Кроме того, параметры, объявленные как const и var, не учитываются.

ARC в мобильных компиляторах Delphi

person Dalija Prasnikar    schedule 13.03.2015
comment
Правда, вы не можете отключить подсчет ссылок ARC в Delphi. Но вы можете обойти его, когда это необходимо. Параметры, объявленные как const и var, не учитываются. Переменные объекта, объявленные как [weak], не учитываются при подсчете ссылок (хотя они отслеживаются для автоматического обнуления). В тех случаях, когда [weak] нежелательно/осуществимо, вы можете просто прибегнуть к Pointer приведению типов к заданиям. Конечно, Free()/FreeAndNil() больше не будет работать, вам придется вызывать Destroy()/DisposeOf() напрямую. Не идеальное решение, но в некоторых случаях может оказаться полезным. - person Remy Lebeau; 13.03.2015