Objective-C ARC против MRR: зачем переход?

Я новый разработчик какао, работающий на C#/Java. Я познакомился с шаблонами управления памятью, которые использует язык Objective-C, и я просто нахожу их очень полезными для разработки с учетом кода.

Почему Apple теперь хочет, чтобы мы вместо этого использовали ARC (автоматический подсчет ссылок) из MRR (Manual Retain-Release) и какие преимущества, помимо экономии времени, предлагает ARC?

Я вижу, что такой переход негативно влияет на привычки хороших граждан, которые разработчики получают от экосистемы obj-c.

Ник


person Nicholas Credli    schedule 18.12.2011    source источник
comment
Спасибо @pst за редактирование. Это был мой первый пост, и я забыл объяснить новые аббревиатуры.   -  person Nicholas Credli    schedule 19.12.2011


Ответы (3)


К сожалению, облегчение компетентным разработчикам правильных действий имеет побочный эффект, облегчая новым разработчикам возможность не учиться, но, похоже, оно того стоит.

Однако ARC является менее щадящим, чем сборщик трассировки, такой как C# или Java. Если у вас нет четкой модели владения объектами, вы почти наверняка создадите циклы и утечку памяти. Я надеюсь, что это станет достаточно очевидным (с помощью инструментов? Это все еще требует поиска... не уверен, что здесь можно сделать), чтобы новые разработчики быстро научились сохранять свой граф объектов четким и ацикличным.

person Catfish_Man    schedule 18.12.2011
comment
Спасибо @Catfish_Man, я бы предпочел, чтобы ARC больше походил на систему предупреждений компилятора, поддерживаемую статическим анализатором. - person Nicholas Credli; 19.12.2011
comment
@NicholasE.Credli: Это строго намеренно: большинство правил ARC основаны на принципе, согласно которому компилятор должен быть прав в 100% случаев, поэтому, когда вы бросаете ему неоднозначный случай, он не догадается, что вы имеете в виду. а просто выдать ошибку. Решение состоит в том, чтобы просто сделать ваш код недвусмысленным. - person Peter Hosey; 19.12.2011

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

Большинство людей, которых я знаю, в любом случае использовали autorelease после каждого alloc, потому что это сэкономило вам release позже, и вы не могли забыть поставить его на самом деле. Таким образом, объект существовал до тех пор, пока пул автоматического освобождения не был опустошен, а с помощью ARC объект освобождается, когда он больше не нужен. Я думаю, что в этих случаях программа, скомпилированная с помощью ARC, даже будет использовать меньше памяти.

И, позор мне, это также помогает мне снизить частоту сбоев моих приложений.
Этот преждевременный выпуск, который происходит каждые 10 000 запусков. Тот, который я никогда не мог полностью отследить, надеюсь, с ARC это уйдет в прошлое.


Я вижу, что такой переход негативно влияет на привычки хороших граждан, которые разработчики получают от экосистемы obj-c.

вероятно, точно так же разработчик встраиваемых систем, который начал с ассемблера, думает, что люди, которые начинают с C и никогда не использовали ассемблер, приобретают плохие привычки.

На мой взгляд, обсуждение MRR и ARC похоже.
И ARC, и C позволяют писать более удобный для сопровождения код за более короткое время. И то, и другое может привести к увеличению объема памяти и процессора.
Если я правильно помню, Apple объявила, что они немного увеличили скорость до retain и release, чтобы компенсировать это влияние на использование процессора. И из-за этого нет реальной причины, по которой MMR все еще существует.

Я, например, приветствую наших новых повелителей ЭРК.

person Matthias Bauch    schedule 18.12.2011

Мне на самом деле очень понравилось переходить на ARC — одной проблемой меньше. вдобавок ко всему, я думаю, что новички часто будут сбиты с толку значением соглашений об именах (+alloc, -copy и т. д. против [NSString stringWith....]). единственный сложный момент - это когда вы начинаете иметь дело с CoreFoundation и т. д. (C API), где вам все равно нужно помнить, кто чем владеет.

person Mike K    schedule 22.12.2011