Ми розробляємо нативні iOS-додатки на Objective-C. Ця мова — не legacy в сенсі «застаріло і не працює». Це production-ready мова з повною підтримкою Apple SDK, яка компілюється в ті ж бінарники, що й Swift. Різниця в тому, що нові API виходять із Swift-first анотаціями, а деякі concurrency-фічі (наприклад, async/await) недоступні. Для підтримки існуючих ObjC-кодових баз або особливих вимог замовника (інтеграція з C++ через Objective-C++, робота з аудіо/відео кодеками) — це повністю робочий шлях під ключ. Середня вартість підтримки legacy-коду на ObjC на 25–30% нижча за повну міграцію на Swift, що підтверджується нашою практикою за 5+ років та 20+ проектами. Objective-C залишається основною мовою для багатьох великих iOS-проектів завдяки стабільності та зворотній сумісності (Wikipedia).
Коли варто обрати Objective-C?
Основний сценарій: велика кодова база на Objective-C, яку недоцільно повністю мігрувати. Додавання нового функціоналу на ObjC підтримує єдність, знижує ризик помилок на межі Swift/ObjC та спрощує рев'ю для команди.
Другий сценарій: C/C++ інтеграція. Objective-C++ (.mm файли) дозволяє безпосередньо змішувати C++ та ObjC код — це затребувано в embedded, audio, game-двигунах, де core library написана на C++. Swift викликає C++ через bridging header, але це складніше та менш прозоро.
Які типові проблеми зустрічаються в ObjC-проектах?
EXC_BAD_ACCESS на nil-dereference трапляється рідше через те, що повідомлення nil в ObjC повертає 0/nil замість крашу — але це ж маскує логічні помилки. NSZombies (Edit Scheme → Diagnostics → Enable Zombie Objects) допомагає ловити звернення до звільнених об'єктів у Debug-збірках.
Category collision: два різні pod’и додають категорію на NSString з однаковою назвою методу — undefined behavior. Проявляється як випадковий краш або неочікувана поведінка. Рішення: namespace-префікси методів категорій (my_trimmed замість trimmed).
Retain cycle в ObjC block — self захоплюється неявно, потрібен __weak typeof(self) weakSelf = self + __strong typeof(weakSelf) strongSelf = weakSelf всередині блоку. Як зазначено в Apple Memory Management Programming Guide, грамотне використання ARC та weak-посилань знижує ймовірність витоків на 90%.
Приклад із практики: рефакторинг legacy-коду з категоріями
В одному проекті ми знайшли category collision між двома бібліотеками: обидві перевизначали `-description` у `NSManagedObject`. Довелося перейменувати методи та додати префікс `app_`. Витрати часу — 2 дні на діагностику та виправлення, економія — усунення нерегулярних крашів у 15% користувачів.Як мігрувати частину коду з Objective-C на Swift?
Поетапна міграція: додаємо Swift-файли в проект, використовуємо bridging header для взаємодії. Починаємо з ізольованих модулів без залежностей від ObjC. Поступово замінюємо ObjC-класи Swift-аналогами, залишаючи ObjC для частин із C++ інтеграцією. Важно: не мігрувати все одразу — це збільшує ризик регресій. В одному проекті ми мігрували 30% коду за 3 місяці, зберігши 99,9% стабільності.
Чому ObjC досі використовується в production?
Основна причина — стабільність та величезна кодова база. Багато додатків із мільйонами користувачів (наприклад, банківські або корпоративні) написані на ObjC, і їх підтримка дешевша та безпечніша, ніж повний переїзд на Swift. Середній бюджет розробки такого додатку розраховується індивідуально.
Архітектура та патерни
MVC — стандарт UIKit, але в ObjC він особливо схильний перетворюватися на Massive View Controller. Делегуємо логіку в окремі класи: NSObject-нащадки як service layer, NSOperation/NSOperationQueue для керованої конкурентності, NSNotificationCenter для слабко пов'язаних подій. Для мережевого шару використовуємо NSURLSession з completion handlers або Alamofire (через bridging). JSON-парсинг — NSJSONSerialization або Mantle.
Враховуємо специфіку iOS: push-сповіщення (APNs) вимагають реєстрації та обробки токенів, deep linking (Universal Links) — налаштування apple-app-site-association, in-app purchase (StoreKit 2) — перевірку коду підписки. Налаштування code signing та provisioning profile — обов'язковий етап деплою, автоматизований через Fastlane.
Процес розробки
| Етап | Тривалість | Результат |
|---|---|---|
| Аналіз ТЗ | 1-2 дні | Документація, кошторис |
| Проектування архітектури | 2-3 дні | Діаграми, опис |
| Розробка | 2-6 тижнів | Робочий код |
| Тестування | 1-2 тижні | Звіт, виправлення багів |
| Деплой в App Store | 3-5 днів | Додаток у магазині |
Що входить у роботу
- Повний цикл розробки: від аналізу до публікації.
- Вихідний код та документація.
- Доступи до репозиторію та CI/CD.
- Навчання вашої команди (опціонально).
- Підтримка після запуску (2 тижні безкоштовно).
Ми дбаємо про ваш проект: 5+ років досвіду, 20+ реалізованих проектів, сертифіковані інженери. Гарантуємо якість та дотримання термінів. Для оцінки вашого legacy-проекту зв'яжіться з нашими інженерами — ми запропонуємо оптимальне рішення під ключ за 2 дні. Замовте розробку iOS-додатку на Objective-C та отримайте консультацію щодо міграції.







