Немає недоліків. Використай це. Зробіть це сьогодні. Це швидше, ніж ваш старий код. Це безпечніше, ніж ваш старий код. Це простіше, ніж ваш старий код. Це не збирання сміття. У нього немає накладних витрат GC. Компілятор вставляє і зберігає у всіх місцях, де ви повинні мати місце. Але він розумніший за вас і може оптимізувати ті, які насправді не потрібні (так само, як він може розкручувати цикли, виключати тимчасові змінні, вбудовані функції тощо).
Гаразд, зараз я розповім вам про невеликі недоліки:
Якщо ви давно розробник ObjC, ви будете смикатися приблизно тиждень, коли побачите код ARC. Ви дуже швидко переберете це.
Існує кілька (дуже) невеликих ускладнень при встановленні коду Core Foundation. Існує дещо більше ускладнень у роботі з будь-чим, що трактується id
як "a" void*
. Такі речі, як C-масиви, id
можуть задуматися над тим, щоб зробити правильно. Неохайне поводження з ObjC va_args
також може спричинити проблеми. Більшість речей, що стосуються математики на покажчику ObjC, складніше. У вас не повинно бути багато цього в будь-якому випадку.
Ви не можете поставити id
а struct
. Це досить рідко, але іноді використовується для пакування даних.
Якщо ви не дотримувались правильного іменування KVC та змішуєте код ARC та non-ARC, у вас виникнуть проблеми з пам'яттю. ARC використовує KVC іменування для прийняття рішень щодо управління пам'яттю. Якщо це все ARC-код, то це не має значення, оскільки це зробить це те саме "неправильно" з обох сторін. Але якщо це змішаний ARC / non-ARC, то тут є невідповідність.
ARC буде просочувати пам'ять під час викидів ObjC. Виняток ObjC має бути дуже близьким за часом до припинення вашої програми. Якщо ви збираєте значну кількість винятків ObjC, ви використовуєте їх неправильно. Це можна виправити за допомогою -fobjc-arc-exceptions
, але воно несе пені, про які йдеться нижче:
ARC не просочується пам'яті під час викидів ObjC або C ++ у винятковому коді ObjC ++, але це коштує як часу, так і простору. Це ще одна з довгого списку причин, щоб мінімізувати використання ObjC ++.
ARC взагалі не працюватиме на iPhoneOS 3 чи Mac OS X 10.5 або новіших версій. (Це не дозволяє мені використовувати ARC у багатьох проектах.)
__weak
покажчики не працюють належним чином на iOS 4 або Mac OS X 10.6, що шкода, але обходити досить просто. __weak
покажчики чудові, але вони не є першою точкою продажу ARC.
Для 95% + коду там ARC є геніальним, і немає жодних причин уникати цього (за умови, що ви можете керувати обмеженнями версії ОС). Що стосується коду, що не стосується ARC, ви можете передавати -fno-objc-arc
його по кожному файлу. На жаль, Xcode робить це набагато складніше, ніж це слід зробити на практиці. Ви, мабуть, повинні перемістити код, який не є ARC, в окремий xcodeproj, щоб спростити це.
На закінчення переходьте на ARC, як тільки зможете, і ніколи не озирайтеся назад.
EDIT
Я бачив пару коментарів: "використання ARC не замінює знання правил управління пам'яттю какао". Це здебільшого правда, але важливо зрозуміти, чому і чому ні. По-перше, якщо весь ваш код використовує ARC, а ви порушуєте Три магічні словавсюди у вас все одно не буде проблем. Шокуюче сказати, але там ви йдете. ARC може зберегти деякі речі, які ви не мали на увазі зберегти, але вони також випустять їх, так що це ніколи не матиме значення. Якби я сьогодні викладав новий клас у Какао, я, мабуть, витратив не більше п’яти хвилин на фактичні правила управління пам’яттю, і, напевно, згадував би лише правила іменування управління пам’яттю під час обговорення імен KVC. З ARC, я вважаю, що ви насправді можете стати гідним початківцем програмістом, навіть не вивчаючи правил управління пам'яттю.
Але ти не міг стати гідним проміжним програмістом. Вам потрібно знати правила, щоб правильно з'єднатись із Core Foundation, і кожен програміст-проміжник повинен в якийсь момент мати справу з МВ. І вам потрібно знати правила для змішаного коду ARC / MRC. І вам потрібно знати правила, коли ви починаєте возитися з void*
вказівниками на id
(які вам і надалі потрібно виконувати KVO правильно). І блоки ... ну, керування пам'яттю блоків просто дивно.
Отже, моя думка полягає в тому, що основне управління пам’яттю все ще важливе, але там, де я витрачав значний час на констатацію та перезапуск правил для нових програмістів, ARC це стає більш вдосконаленою темою. Я вважаю за краще, щоб нові розробники думали з точки зору об'єктних графіків, а не наповнювали їх головами основними закликами до objc_retain()
.