9

Какова техническая причина, по которой ARC поддерживается только iOS 4.0 и выше?Почему ARC работает только для iOS 4.0+?

Я понимаю, что это функция компилятора, которая автоматически вставляет код, связанный с управлением памятью, вместо того, чтобы требовать от разработчика этого. Из того, что я читал, сами звонки остаются неизменными - по крайней мере, это подразумевает яблоки Transitioning to ARC Guide.

Таким образом, он не должен включать функции, которые не присутствовали в предыдущих версиях iOS, и, действительно, ARC работает с iOS 4.0, несмотря на то, что была представлена ​​позже.

Я задаю этот вопрос из любопытства и на самом деле не нужно делать работу ARC с iOS 3.x.

ответ

16

По той же причине, что автоматический подсчет ссылок поддерживает только 64-битный Snow Leopard в качестве минимальной цели развертывания: поддержка ARC требует наличия определенных функций только в новой версии современной версии. Эта современная среда исполнения была внедрена с iOS 4.0, поэтому в старых версиях iOS отсутствует среда выполнения, способная обрабатывать некоторые из тех вещей, которые технически требуются ARC. Если бы это было просто ключом к версиям ОС, также поддерживались 32-разрядные приложения Snow Leopard, но только 64-битная среда исполнения там была современной.

Если вы просматриваете презентации от Apple с WWDC 2011, в частности, «Интеграция целей Objective-C», вы увидите, что для ускорения процесса сохранения/освобождения было сделано несколько усовершенствований, а также такие вещи, как быстрее @autoreleasepool. В разделе LLVM ARC specification есть целый раздел поддержки выполнения. Эти улучшения требуют больше, чем просто поддержки компилятора.

Нам уже пришлось использовать современную среду выполнения для таких функций, как автоматический синтез переменных экземпляра (как объясняется в Apple's documentation), так что это не страшный сюрприз.

Даже у iOS 4.0 в качестве цели не хватает поддержки слабых ссылок, поэтому здесь явно возникают технические проблемы. Это не просто маркетинговая стратегия, которая побуждает разработчиков к более новым версиям, как утверждают другие.

+1

Маловероятно, что для ARC требуется некоторая особенность x86-64, отсутствующая на i386, которая предотвращает ее перемещение. «Технический», «Маркетинг», «Ресурс», «Менеджмент», «Практический» и т. Д. - все субъективные термины. Если кто-то из Apple не захочет чип во всех ответах на вопрос OP, в лучшем случае догадки. Действительно, разные люди в Apple, в зависимости от их роли, вероятно, имеют разные причины! В нем нет «четко» - обратите внимание на использование «вероятно» и «угадать» в других ответах. – CRD

+4

@CRD - Возможно, вам стоит прочитать приведенную выше документацию Apple, где говорится: «Приложения iPhone и 64-разрядные программы в Mac OS X версии 10.5 и более поздних версий используют современную версию среды выполнения. Другие программы (32-разрядные программы на Mac OS X) используют устаревшую версию среды выполнения ». Речь идет не о x86-64 и i386, а о возможностях выполнения. Как я уже упоминал, существуют технические различия между версиями времени исполнения, поставляемыми с каждой ОС, и для поддержки ARC требуется достаточно новая версия среды выполнения. Backporting более поздние версии для старых версий ОС не представляется возможным. –

+0

, за исключением того, что ARC не работает на 10,5 ..., который использует современную среду выполнения ... и почему не работает современная среда выполнения на i386 ... и т. Д. В конце концов мы закончим утверждение полноты Тьюринга :-) – CRD

1

Я предполагаю, что цепочка инструмента clang (требуется для ARC) не создает двоичные файлы, совместимые с iOS 3.x.

Кроме того, есть несколько функций C, используемых в месте отправки -retain и -release, которые не могут быть доступны в IOS 3.x

http://www.informit.com/articles/article.aspx?p=1745876

2

Вид на тот же вопрос будет:

Почему NSRegularExpression поддерживается только iOS 4.0+ и Mac OS X 10.7 (Lion) +?

Вы полностью работоспособны имитаторы прошивки 5.0 (и 4.0 очевидно) в Mac OS X 10.6.7 (Snow Leopard), где вы можете легко использовать NSRegularExpression, но это не поддерживается Mac OS X 10.6.7 сами.

И что касается вашего вопроса: ARC была представлена ​​с iOS 5.0. В то время пользователей iOS 3.x было немного, поэтому я считаю, что Apple слишком ленив, чтобы ARC совместима с iOS 3.x.

4

В заявке docs of Apple указано, что привязка dealloc к супер обрабатывается во время выполнения в случае ARC.

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