Нет причины , а не , чтобы использовать 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];
}
В этом случае без ARC нам пришлось бы делать 2 [number release]
вызовов. Один раз до преждевременного возвращения и один раз в конце метода. Между прочим, это, кстати, надуманный пример - просто чтобы показать идею. С ARC нам не нужно вводить эти 2 звонка, это делает это за нас. Я думаю, вы можете увидеть силу ARC здесь, потому что в этом сценарии, если ваш метод стал немного больше и сложнее, вы могли бы очень легко забыть освободить вещи до преждевременного возврата из метода.
Вернемся к вопросу о 4.x ... Вы правы, что не можете использовать weak
ссылки. Это потому, что это единственная часть ARC, которая требует помощи от среды выполнения, и это не часть среды выполнения, поставляемой с 4.x. Среда выполнения автоматически удалит слабые ссылки, когда объект, на который он указывает, исчезнет. Таким образом, если у вас есть ObjectA со слабой ссылкой на ObjectB (например, шаблон делегата), то если ObjectB исчезнет из-за того, что он больше не используется, то ссылка ObjectA будет исключена. Это только служит защитной сеткой на мой взгляд. Вы должны кодировать так, чтобы этот сценарий никогда не происходил в любом случае. Так было с тех пор, как появились слабые ссылки, и вам просто нужно кодировать так, чтобы не допустить, чтобы это стало проблемой - то, чем мы все занимаемся уже много лет.
На мой взгляд, вы должны использовать ARC. Это поможет вам. Вы получите намного меньший код и более читаемый код, потому что у вас нет сохранений, выпусков и автоматических выпусков по всему вашему коду. Вы получите меньше сбоев и утечек из-за неправильного управления памятью, с чем у нас всех возникли проблемы.
Вкратце: ИСПОЛЬЗОВАТЬ ARC.