2015-02-21

GC vs ARC

Mac Apps That Use Garbage Collection Must Move to ARC

Beginning May 1, 2015, new Mac apps and app updates submitted to the Mac App Store may no longer use garbage collection, which was deprecated in OS X Mountain Lion. Instead, migrate your apps to Automatic Reference Counting, using the migration assistant in Xcode to help with this transition. Apps may continue to use retain/release for manual memory management. For more information, read the Transitioning to ARC Release Notes.

Как-то я всегда недолюбливал GC. Он как наемный уборщик, который приходит раз в неделю к вам домой, а вы привыкли бросать мусор на пол, так что у вас жутко грязно. А уборщик вместо того, чтобы подмести мусор, первым делом выгоняет всех из квартиры, потом выкидывает все из шкафов на пол, и затем начинает сортировать все вещи скопом вместе с мусором, наклеивая на них бумажки: это надо, это не надо. И так долго-дорого...
- Пластинки выкидываем, нет проигрывателя...
- Стой! Проигрыватель на даче!
- За дачу не плачено...
- Стой! Плачу за дачу тоже, не выкидывай!
- Тогда я поехал на дачу бумажку наклеить, вы пока не заходите!
Рука-лицо.

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

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

2 comments:

SKuznetsov said...

Reference Counting ближе к "выкидывать мусор сразу". Но не знаю, насколько ARC делает это "сразу". По идее, с учётом наличия "мусора" должен быть построен и синтаксис языка программирования. Например, важная "фишка" языка D в том, что переменная по умолчанию видна только в своём потоке, а для её видимости из других потоков надо это указывать явно.

Valery Tolkov said...

Обычно в домашнем хозяйстве мы выкидываем сразу в ведро, и когда он наполнится выкидываем пакет из ведра в бак, и раз в неделю приезжает машина забрать бак, и так далее.
Так и ARC может перелинковать блок памяти в свободный пул, а освободить пул как-нибудь потом.
Я сам делал такой suballocator. Очень удобно, если часто создаешь-удаляешь объекты одинакового размера. Делаем список таких свободных объектов. Удаление - поместить элемент в голову такого списка - очень быстро, два присваивания. Потом аллокация - взять из головы - те же два присваивания.