Почему при автоматическом подсчете ссылок сохранение, освобождение и удаление не разрешены? - PullRequest
39 голосов
/ 08 июня 2011

При попытке использовать -retain, -release и -dealloc при создании приложения с использованием автоматического подсчета ссылок в Xcode 4.2 я получаю сообщение об ошибке, подобное следующему:

Автоматический подсчет ссылок запрещает явная отправка сообщения 'dealloc'

Почему я вижу эту ошибку? Разрешены ли -retain, -release и -dealloc при автоматическом подсчете ссылок?

Ответы [ 4 ]

67 голосов
/ 21 июня 2011

В основном:

При использовании ARC это все или ничего.Либо компилятор управляет всеми сохранениями / релизами / деллоками для вас, либо он ничего не делает.Вы не можете перемежать свои собственные вызовы с ними, потому что компилятор хочет сделать все сам.Это может привести к абсурдной оптимизации (например, метод, который возвратил автоматически выпущенный объект в разделе «Ручное управление памятью», теперь может создать объект, который никогда не попадет в пул автоматического выпуска).Если бы вы начали добавлять свои собственные вызовы для сохранения и освобождения, компилятору пришлось бы работать с ними, и он не смог бы выполнить много оптимизаций, которые он хочет (и которые вы должны хотеть).

И в качестве дополнительного бонуса, вызов -retainCount теперь является ошибкой компилятора!О, С ДНЕМ!

1 голос
/ 01 декабря 2014

В режиме автоматического подсчета ссылок сохранение, освобождение и освобождение не разрешены.

Если у вас есть существующий код, вы можете продолжать использовать его как есть с -fno-objc-arc, который вы можете выборочно отключитьARC для любого файла.

Если вы хотите отключить ARC для файлов MULTIPLE:

Выберите нужные файлы в Target / Build Phases / Compile Sources в Xcode PRESS ENTER.(двойной щелчок выбирает только один файл) Тип -fno-objc-arc Нажмите Enter или Готово

1 голос
/ 05 февраля 2012

в ответ на AliSoftware: мы CNA смешиваем структуры ARTC и не-ARC, а также источник дуги и не-ARC.

(я сделал это ..)

Основные идеи: 1) компилятор будет вставлять / удалять вызовы, как это может сделать очень-очень хороший программист какао 2) какао - это ЛЮБОЙ код C, поэтому у нас есть отдельные компиляции, поэтому компоновщик МОЖЕТ связать двоичные файлы, созданные из нескольких источников.Подумайте об этом, поскольку мы можем смешивать асм и какао, или С и паскаль ...

по главному мнению, здесь преимущество Apple над c # / java: мы всегда разрешаем смешивать, и, используя технику COMPILER 8non aвремя выполнения ..) мы можем поспешить производительность за пределы.

0 голосов
/ 17 апреля 2016

Как я уже указывал в моем ответе на Xcode ARC, вы можете скомпилировать определенные исходные файлы как не-1008 *. Dave DeLong ответ немного неточный. Сюда не входит тот факт, что вы можете указать компилятору компилировать исходный код как не ARC в проекте с поддержкой ARC (как объяснено здесь ).

...