Примечательно, что ARC мирно сосуществует с “не-ARC” кодом с ручным управлением памятью в одном и том же приложении.
Если вы работаете уже с существующей базой кода, изменение этой настройки может повлечь за собой громадное число ошибок. ARC не только управляет памятью вместо вас, но и запрещает вам делать это собственноручно.
немного противоречиво получается. все-таки как с этим реально обстоит дело?
Насчет существующей базы, думаю, следует понимать так: если вы сконвертили «олд скул» код под использование АПС, то из-за того, чтоб эффективно использовать память в вашем приложении и избежать утечек (впрочем, как говорит автор и я с ним согласен, в официальных фреймворках), вы должны использовать пресловутые retain/release/autorelease (см. п.1 и п.2 из правил в статье). Это неизбежно, если вы хотите, чтоб ваше приложение не текло. Сосуществование происходит в том случае, если у вас сбалансированы retain и release. В этом случае АПС нормально воспримет ваш код. :)
Это мое понимание вопроса.
Как на самом деле обстоит — в планах попробовать сконвертить «что-нить эдакое» на выходных, если будет возможность.
Как я думаю, в общих чертах вы правы. Одно замечание: линковка будет нормальной ТОЛЬКО после того, как вы сконвертировали проект под АПС и включили ту самую опцию в настройках.
Не очень понял что вы имели ввиду. У нас есть свой проект, например игра и мы хотим использвать ARC. Есть cocos2d, который мы тоже хотим использовать, но который не поддерживает ARC. cocos2d подключается к проекту как статическая библиотека. В этом случае нам нет необходимости конвертировать cocos2d в ARC. Наш проект может использвать ARC, cocos2d будет использвать retain/release и оба они будут нормально линковатся друг с другом.
Если владеете английским, лучше посмотрите презентацию с WWDC «Introducing Automatic Reference Counting». Статья — ее вольный пересказ с кучей неточностей
для тех, которые возможно читают этот тред, подробные инструкции со StackOverflow:
1) Зайти в Build Phases проекта;
2) Открыть Compile Sources (там будут только те исходники, которые используются для получения бинарников. Не удивляйтесь, если там не будет некоторых файлов, которые вы используете для либ);
3) Выделить файлы, в которых нужно использовать ARC. Кликнуть по ним, появится окошко, ввести туда "-fobj-arc"
«прим. переводчика: Совершенно не понял смысл этого пассажа в контексте разбора ARC. Возможно, автор допустил опечатку, вместо zeroing weak references должно быть non-zeroing weak references»
Наверно имелось в виду что zeroing weak reference доступны только в IOS >=5 и MacOS >= 10.7,
а в предыдущих версиях weak останется тоже самое что assign.
С автоматическим удалением ivar'ов не все так просто и прозрачно в ARC для блоковых переменных.
если блок объявлен как: @property( copy ) BlockType simpleBlock;
то в деаллоке нужно будет сделать self.simpleBlock = nil; руками иначе будет утечка.
Сразу хвататься за ARC не стоит. Все-таки ARC есть некоторая надстройка над уже существующей системой. Настоятельно советую сначала понять модель управления памятью, а потом переходить на ARC.
Automatic Reference Counting: часть 1