2015-03-13 10 views
2

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

+7

Это продолжает тему ваших последних вопросов, где вы, кажется, бороться против системы. Продолжайте использовать AnsiString. Отключить ARC. Я думаю, вам лучше помочь, пытаясь пойти с потоком, а не плавать против тока. –

+0

Вы правы. Я также работаю над альтернативами, но было бы неплохо, если бы я мог повторно использовать уже существующий код. – Friso

ответ

9

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

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

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

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

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

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

ARC in Delphi mobile compilers

+2

Правда, вы не можете * отключить * пересчет ARC в Delphi. Но вы можете обойти его, когда это необходимо. Параметры, объявленные как 'const' и' var', не пересчитываются. Переменные объекта, объявленные как '[слабый]', не пересчитываются (хотя они отслеживаются для автоматического заполнения). В тех случаях, когда '[слабый]' нежелателен/не поддается действию, вы можете просто прибегнуть к типу типа «Pointer» при назначении. Конечно, 'Free()'/'FreeAndNil()' больше не будет работать, вам нужно будет вызвать 'Destroy()'/'DisposeOf()' напрямую. Не идеальное решение, но в некоторых случаях это может быть полезно. –

Смежные вопросы