История Objective-C
Черновик статьи. Ниже — развёрнутая хронология, идеи дизайна, runtime и контекст перехода к Swift.
Краткая хронология
| Год | Событие |
|---|---|
| 1980s | Brad Cox и Tom Love в Stepstone — Objective-C как "C + Smalltalk OO" |
| 1984 | Книга Object-Oriented Programming: An Evolutionary Approach |
| 1988 | NeXT лицензирует Objective-C для NeXTSTEP OS |
| 1996 | Apple покупает NeXT — Objective-C становится основой macOS разработки |
| 2001 | macOS X (Cocoa) — AppKit, Foundation |
| 2007 | iPhone SDK — Objective-C + UIKit |
| 2011 | ARC (Automatic Reference Counting) — конец эры ручного retain/release для большинства |
| 2014 | Apple представляет Swift — язык по умолчанию для новых проектов |
| 2014+ | Mixed targets, bridging headers, @objc в Swift |
| 2020s | SwiftUI доминирует в UI; Obj-C в legacy и system frameworks |
Brad Cox хотел гибрид: производительность и совместимость C с объектной моделью Smalltalk без переписывания всей кодовой базы Unix.
Мотивация дизайна
C как фундамент
Objective-C — надмножество C: можно смешивать процедурный C и объекты в одном файле .m. Это упростило интеграцию с существующими библиотеками POSIX и BSD.
Smalltalk-style messaging
[receiver selector:arg] — отправка сообщения runtime, а не статический вызов функции как в C. Receiver может не реализовать метод — тогда срабатывает forwardInvocation: или crash (в отличие от compile-time binding в C++).
Dynamic runtime
objc runtime хранит метаданные классов, позволяет:
- добавлять методы через categories;
- introspection:
NSClassFromString,respondsToSelector:; - method swizzling (осторожно, в основном debugging и AOP в legacy).
Подробнее о философии — Smalltalk — о разделе.
NeXTSTEP и Cocoa pipeline
Stepstone Obj-C → NeXTSTEP → OPENSTEP → macOS Cocoa → iOS UIKit
| Этап | Продукт |
|---|---|
| NeXT | NeXTSTEP, Interface Builder, AppKit |
| Apple 1996 | ОСнова macOS X |
| 2007 | UIKit — мобильный вариант AppKit-идей |
| Сегодня | Cocoa (macOS), UIKit/SwiftUI (iOS) |
Многие паттерны iOS (delegate, target-action, NIB/XIB) пришли из NeXTSTEP 1990-х.
Идеи дизайна
Objective-C добавляет к C:
- Messaging —
[receiver message:arg]. - Runtime — динамическая диспетчеризация, categories, protocols.
- Reference counting — до ARC вручную (
retain/release/autorelease).
MRC и ARC
| Эра | Управление памятью |
|---|---|
| До 2011 | MRC — разработчик считает retain count |
| 2011+ | ARC — компилятор вставляет вызовы |
| Swift | ARC + struct value semantics |
Чтение старого кода на Stack Overflow часто показывает MRC — понимать dealloc и release полезно для archaeology.
Literals и Modern Objective-C
Xcode 4.4+ (2012):
NSString *s = @"Hello";
NSArray *a = @[ @1, @2 ];
NSDictionary *d = @{ @"key": @"value" };
Сократили шум stringWithFormat: и arrayWithObjects:.
GNUstep и Apple runtime
Существует GNU Objective-C runtime и проект GNUstep — open source reimplementation NeXT API на Linux. Основной рынок — Apple platforms с Apple objc runtime. API похожи концептуально, бинарная совместимость отсутствует.
Сравнение Objective-C и Swift
| Objective-C | Swift | |
|---|---|---|
| Синтаксис | [ ], @ directives | современный, типобезопасный |
| Null | nil для объектов | Optionals |
| Новые API Apple | legacy headers | Swift-first |
| Interop | @objc, bridging header | вызов Obj-C из Swift |
| Производительность | Проверенный runtime | Оптимизации, value types |
| Обучение | Кривая для новичков | Проще старт |
Apple поддерживает оба языка; новый UI-код — Swift, фреймворки экспортируют Obj-C headers для совместимости. Подробнее — Swift — о разделе.
Миграционные стратегии (обзор)
Типичный путь в legacy-проекте:
- Новые файлы — Swift,
Generated-Interface Header для Obj-C callers. - Критичные hot paths оставить в Obj-C до профилирования.
@objcна Swift class для видимости в Obj-C.- Постепенная замена ViewControllers при рефакторинге.
Big-bang rewrite редко оправдан — риск регрессий в UIKit lifecycle.
Objective-C сегодня
- Maintenance миллионов приложений в App Store.
- Чтение заголовков Apple frameworks.
- Собеседования: messaging, retain cycles, blocks.
- Open source: старые pods, части FFmpeg/AFNetworking.
Новый greenfield iOS — Swift + SwiftUI; Objective-C — обязательный навык чтения для senior iOS, не обязательно для написания с нуля.
Что дополнится в следующих версиях статьи
- Детальная линия OPENSTEP → Rhapsody → macOS.
- Blocks (closures) и GCD в Obj-C.
- Сравнение hiring Obj-C vs Swift-only.
- Кейсы чтения legacy open source (пошаговый разбор файла).
Документация Apple Programming with Objective-C (archive) и WWDC сессии по migration to Swift — первичные источники для interop. Практика — первая программа на clang.
Дальше: первая программа · о разделе.
NeXTSTEP heritage
NeXTSTEP дал:
- Dock и app bundle structure;
- Objective-C runtime на Mach;
- Interface Builder culture;
- Путь к macOS Cocoa.
iOS унаследовал многие naming conventions (UIView, NSObject).
MRC → GC → ARC timeline
| Эра | Управление памятью |
|---|---|
| 1980s–2000s | Manual retain/release |
| macOS GC (отменён) | Experimental GC |
| 2011+ ARC | Compiler inserted retain |
Старые кодовые базы могут содержать @autoreleasepool blocks вручную в tight loops — ARC не убирает pools.
GNUstep и Apple runtime
GNUstep — open source reimplementation NeXT API на Linux. Niche desktop; mobile Apple-only. Obj-C синтаксис один, frameworks другие.
Чтение crash log Obj-C
-[MyClass brokenMethod:]: unrecognized selector sent to instance 0x...
Означает selector не найден — typo, wrong type, или object deallocated. Symbolication через Xcode Organizer.
Open source на Obj-C
| Проект | Область |
|---|---|
| AFNetworking (legacy) | HTTP iOS |
| SDWebImage (parts) | Images |
| FFmpeg iOS builds | bindings |
Новые forks часто Swift; оригиналы — учебник Obj-C patterns.
Stepstone и рождение языка (1983–1988)
Stepstone — компания Brad Cox и Tom Love, где Objective-C оформился как продукт: компилятор, runtime и библиотека ICpak. Cox публиковал статьи о Software-IC — аналогии аппаратных микросхем с переиспользуемыми программными компонентами.
| Этап | Деталь |
|---|---|
| 1983 | Первая реализация Obj-C поверх C |
| 1986 | Книга Object-Oriented Programming: An Evolutionary Approach |
| 1988 | NeXT лицензирует Obj-C для платформы NeXTSTEP |
Язык создавался для промышленной интеграции ОО в Unix/C мир 1980-х, а не как чисто академический эксперимент.
NeXTSTEP: среда, а не только язык
NeXTSTEP включала Workspace Manager, Interface Builder, Display PostScript и Enterprise Objects Framework. Objective-C был клеем между C-системными вызовами и объектными фреймворками.
[button setTarget:self];
[button setAction:@selector(saveDocument:)];
Паттерн target-action пережил NeXT и стал основой UIKit/AppKit event model.
Apple после 1996: Cocoa
После покупки NeXT стек переименовали в Cocoa (Foundation + AppKit). Префикс NS — historical NeXTstep, не "Nano Server".
| Фреймворк | Назначение |
|---|---|
| Foundation | Коллекции, строки, даты |
| AppKit | macOS UI |
| UIKit | iOS UI |
| Core Data | Persistence |
Эволюция компилятора
| Эра | Компилятор |
|---|---|
| 1980s–2000s | gcc + GNU runtime (GNUstep) |
| 2005+ | llvm-gcc переход |
| 2011+ | clang default |
| Сегодня | clang + Swift compiler |
clang ускорил сборку больших Obj-C проектов и улучшил диагностику — критично для Xcode.
Blocks и GCD (2010)
Blocks — лексически scoped closures; GCD — очереди без ручного NSThread:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData *data = [self loadData];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
});
Swift closures — наследник Blocks; @escaping решает те же проблемы lifetime.
ARC и MRC
До ARC каждый alloc требовал парный release. ARC вставляет retain/release на этапе компиляции.
| Термин | ARC | MRC |
|---|---|---|
| Владение | Автоматически | retain/release |
| Core Foundation | __bridge | Explicit CFRetain |
iPhone SDK (2008+)
Objective-C + UIKit стали стеком App Store на годы: view controllers, delegation, categories на NSString. Миллионы приложений до сих пор на Obj-C или mixed targets.
Swift и objc runtime
Swift использует objc runtime для interop. @objc классы видны из Obj-C; bridging header импортирует .h в Swift.
| Вопрос | Рекомендация |
|---|---|
| Новый модуль | Swift, если нет ограничений |
| Legacy | Читать Obj-C обязательно |
| Миграция | Постепенно, с тестами |
GNUstep
Open source reimplementation NeXT API на Linux. Runtime — GNU libobjc, не Apple objc4. Niche desktop и образование.
Ключевые фигуры
| Имя | Вклад |
|---|---|
| Brad Cox | Дизайн Obj-C |
| Tom Love | Stepstone |
| Chris Lattner | LLVM, clang, Swift |
Хронология
1980s Stepstone → 1988 NeXT → 1996 Apple → 2007 iPhone → 2011 ARC → 2014 Swift
Упражнения
- Постройте timeline на одной странице с датами из таблицы выше.
- Найдите MRC-код (
releaseвdealloc) на GitHub. - Объясните
nilmessaging тремя примерами. - Сравните category и Swift extension.
- Опишите mixed target и bridging header.
- Связь с Smalltalk — параграф.
- Найдите
.mm(Obj-C++) файл в open source. - Сравните GCD block с Swift closure.
- WWDC год Swift — что изменилось для новых проектов?
- Прочитайте 7.md и соберите Greeter.
FAQ
Кто изобрёл Objective-C? Brad Cox и Tom Love (Stepstone).
Почему NeXT выбрал Obj-C? C compatibility + OOP messaging без C++ complexity.
Swift убил Obj-C? Нет — coexistence; API Swift-first с @objc.
GNUstep для iOS? Нет — Apple SDK only on macOS toolchain.
Что такое Cocoa? Foundation + AppKit (macOS); UIKit на iOS.
Prefix NS? Historical NeXTstep naming.
objc_msgSend bottleneck? Rarely; IMP caching.
KVO/KVC? Runtime observation on Obj-C objects.
Migration strategy? New Swift modules; keep stable Obj-C.
Next step? 7.md, intro.md, Swift.
Blocks origin? C extension Apple 2010; ancestor of Swift closures.
ARC year? 2011 — end of manual retain for most projects.
Chris Lattner role? LLVM, clang, Swift — unified Apple toolchain.
OpenStep? API standard NeXT/GNUstep heritage.
Legacy hiring? Senior iOS still expects Obj-C reading fluency.
Дальше: первая программа · о разделе.
WWDC migration sessions и archive Programming with Objective-C — после практики в первой программе.