Деякі питання щодо автоматичного підрахунку довідок у iOS5 SDK


134

Зараз я розробляю додаток для iPad. Розробка розпочалася для iOS 4.2 і зараз триває (і я думаю, буде завершено) для iOS 4.3. Я щойно читав про ARC в iOS 5, і в основному зрозумів, що ніколи більше не потрібно буде звільняти та зберігати об’єкти. Мої запитання:

  1. Якщо я вирішив оновити до iOS 5, чи потрібно видалити всі [myObject retain]та [myObject release]заяви з мого коду?

  2. Якщо я розробляю нову програму для iOS 5 за допомогою ARC, чи потрібно мені впроваджувати якусь перевірку "ретро-сумісності"? тобто: чи потрібно мені перевірити версію iOS і відповідно зберегти та випустити виклик? Отже, чи є ARC доступний для всіх версій iOS чи лише для iOS 5?

Відповіді:


150

Якщо я вирішую оновити до iOS 5, чи потрібно видалити всі заяви [myObject retain] та [myObject release] зі свого коду?

Так, але XCode 4.2 містить новий інструмент "Переміститись на об'єктивний-C ARC" (у меню Правка-> Рефактор), який робить це для вас. Виклик угоди - інша історія. Як згадується в коментарях, у посиланні кланг зазначено, що ви повинні дотримуватися методу dealloc:

Обґрунтування: навіть якщо ARC автоматично знищує змінні екземпляри, все ж є законні причини для написання методу dealloc, наприклад, звільнення невідступних ресурсів. Якщо не вдасться викликати [super dealloc] у такому методі, це майже завжди помилка.

Ви включаєте ARC, використовуючи новий прапор компілятора -fobjc-arc. ARC підтримується в Xcode 4.2 для Mac OS X v10.6 та v10.7 (64-розрядні програми) та для iOS 4 та iOS 5. (Слабі посилання не підтримуються в Mac OS X v10.6 та iOS 4). У Xcode 4.1 відсутня підтримка ARC.

-

Якщо я розробляю нову програму для iOS 5 за допомогою ARC, чи потрібно мені впроваджувати якусь перевірку "ретро-сумісності"? Т.е.: чи потрібно мені перевірити версію iOS і відповідно зберегти та випустити виклик? Отже, чи є ARC доступний для всіх версій iOS чи лише для iOS 5?

Ні, тому що ARC робить свою магію на час компіляції, а не на час виконання.

Замість того, щоб вам потрібно було пам’ятати, коли використовувати утримувати, випускати та автовипускати, ARC оцінює вимоги до експлуатації ваших об’єктів та автоматично вставляє відповідні методи, що вимагають вас під час компіляції. Компілятор також генерує для вас відповідні методи взаємодії.

Детальна інформація про ARC: http://clang.llvm.org/docs/AutomaticReferenceCounting.html


Дякую за ваше пояснення!
Лука47

4
Це не на 100% правильно. Існує перемикач компілятора, який визначає, активовано ARC чи ні. Також, ARC потребує певної підтримки в режимі виконання, тому, якщо ви хочете, щоб ваш додаток працював на iOS 4.x, вам потрібно залишити у ваших сховищах та релізах і переконатися, що ARC вимкнено.
JeremyP

8
@JeremyP - iOS 4.0 справді підтримується в якості цілі для програм ARC, тому немає необхідності зберігати вручну посилальний код, щоб звертатися до цієї старої платформи. Можливо, iPhone OS 3.x, але я думаю, що Apple може припинити підтримку як цільової платформи, колись 5,0 кораблі, як це було для 2.x, коли вийшов 4.0.
Бред Ларсон

5
@Brad База встановлення для iOS4 вже перевищує 95%. Я думаю, що заощадити, щоб кинути підтримку iOS3.
Генрік П. Гессел

2
Ви не видаляєте dealloc, ви просто видаляєте всі свої releaseі [super dealloc]з нього. А в 99,9% deallocпросто вивільняють об’єкти, тому ви видаляєте їх. Але об'єкти все ж повинні виконувати інші завдання з очищення, яких немає release(закриття файлів, видалення спостерігачів тощо).
Станіслав Ягло

8

Q1: НІ. Якщо у вас є існуючий код, ви можете продовжувати використовувати його, як і у випадку -fno-objc-arc, ви можете вибірково відключити ARC у будь-якому файлі.

Якщо ви хочете відключити ARC на МНОГО файлах:

  1. Виберіть потрібні файли за допомогою Цільових / Фаз збірки / Компілюйте джерела в Xcode
  2. НАВІДКУВАТИСЯ . (подвійне клацання вибирає лише один файл)
  3. Тип -fno-objc-дуга
  4. Натисніть Enter або Готово

Q2: НІ, ціль може бути такою ж низькою, як iOS 4.0


7

Наскільки я розумію, і наскільки мій iPhone / iPod під керуванням iOS 5 та iOS 4.3 відповідно працює, це все досить автоматично. Додаток, який я запустив для 4.0 і "оновив" роботу з Xcode для iOS 5.0, ніколи не кидає будь-яке попередження про мій випуск і збереження, хоча це все за кожну угоду і т.д. (скопіював файл) у новий проект, створений за допомогою Xcode для iOS 5, має багато-багато попереджень. Тому, здається, не потрібно видаляти всі ці дзвінки, і ні, він якось автоматично адаптує їх до старих версій. Профілюючи свій iPod, я не бачу витоку пам’яті та інших ознак невдалої угоди / випуску. Чи допомагає це?


Остання бета-версія насправді спонукає мене видалити всі дзвінки про розподіл, і це стосується цього. Ви все одно можете зберегти / випустити, але система має останнє слово.
Ділан Геттей

5

Щодо цієї частини вашого питання

Якщо я розробляю нову програму для iOS 5 за допомогою ARC, чи потрібно мені впроваджувати якусь перевірку "ретро-сумісності"? Т.е.: чи потрібно мені перевірити версію iOS і відповідно зберегти та випустити виклик? Отже, чи є ARC доступний для всіх версій iOS чи лише для iOS 5?

Слід зазначити, що компілятор iOS 5 займає "ретро-сумісність" (він фактично додає код, щоб зробити роботу збереження / випуску по суті), але якщо ви не компілюєте для iOS 5.0, ви не можете використовувати weakяк ключове слово . Натомість ви використовуєте assign. Це прикро: weakвеличезна перевага (ніколи не звисаючи вказівники!). Дивіться моє запитання тут для обговорення weak, assignі АРК.


2

Якщо ви можете відключити ARC, не використовуючи новий прапор компілятора -fobjc-arc, тоді ви не змушені повторно писати код, рухаючись вперед - я думаю (?)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.