Нет причины не использовать ARC при развертывании до 4.x. Совершенно некорректно говорить, что ARC вызывает сбои и проблемы на чем-то ниже iOS 5. Это полностью лишено смысла и не понимает, что такое ARC.
ARC - это время компиляции «funkiness». Это то, что мне нравится называть так или иначе! Он просто добавляет в нужное количество сохранений и выпусков или автореализаций, чтобы ваши объекты оставались вокруг столько, сколько им нужно. Мне нравится думать об этом как о том, как превращать объекты в переменные стека. Так считают этот код:
- (void)methodA {
NSNumber *number = [[NSNumber alloc] initWithInt:5];
[someObject doSomethingWithANumber:number];
}
ARC добавит в release
из number
, когда переменная number
выходит из области видимости. В этом случае он выходит за пределы области, когда возвращается methodA
. Так считают это более сложный фрагмент кода:
- (void)methodB {
NSNumber *number = [[NSNumber alloc] initWithInt:5];
if (<some_expression>) {
return;
}
[someObject doSomethingWithANumber:number];
}
В этом случае, без АРК нам пришлось бы поставить в 2 [number release]
вызовов. Один раз перед преждевременным возвратом и один раз в конце метода. Очевидно, что это надуманный пример, кстати - это просто показать идею. С ARC нам не нужно вводить эти 2 вызова, это делает это для нас. Я думаю, вы можете увидеть силу ARC здесь, потому что в этом случае, если ваш метод стал немного больше и сложнее, вы могли бы легко забыть о выпуске вещей до преждевременного возврата из метода.
Назад к пункту в руке о 4.x ... Вы правы, что не можете использовать ссылки weak
. Это потому, что это единственная часть ARC, которая требует помощи из среды выполнения, и это не является частью среды выполнения, поставляемой с 4.x. Время выполнения автоматически отключит слабые ссылки, когда объект, на который он указывает, уходит. Поэтому, если у ObjectA есть слабая ссылка на ObjectB (например, шаблон делегирования), то, если ObjectB уходит, потому что он больше не используется, тогда ссылка ObjectA будет отключена. На мой взгляд, это служит только сетью безопасности. Вы должны кодировать, чтобы этот сценарий никогда не был. Это было так с тех пор, как появились слабые ссылки, и вам просто нужно закодировать таким образом, чтобы не допустить, чтобы это было проблемой - то, что мы все делали уже много лет.
На мой взгляд, вы должны использовать ARC. Это поможет вам. Вы получите гораздо меньший код и более читаемый код, потому что у вас нет сохранений, выпусков и автореализаций всего кода. Вы получите меньше аварий & утечки из неправильного управления памятью, что-то, что у нас все были проблемы с.
Вкратце: USE ARC.
Не может отвечать лучше, чем Роб. См. Принятый ответ в этом разделе: http: //stackoverflow.com/questions/8760431/ios-to-arc-or-not-to-arc-pros-and-cons – Vin
user1038017, ARC улучшает структуру распределения большинства приложений , Он часто уменьшает отметку «высокая вода» в распределении памяти. Это очень хорошо на машинах, таких как iPhone 3G, которые застревают в iOS v4.2.1. Поскольку 'unsafe_unretained' имеет ту же самую семантику, что и политика распределения назначений для приложения MRR, вы не меняете ничего, что вам уже нужно было управлять. ARC не делает ваше приложение неустойчивым. Нестабильность всегда была там. ARC особо не раскрывает его. Andrew – adonoho