Перейти к основному содержимому

История Objective-C

Разработчику

Черновик статьи. Ниже — развёрнутая хронология, идеи дизайна, runtime и контекст перехода к Swift.


Краткая хронология

ГодСобытие
1980sBrad Cox и Tom Love в Stepstone — Objective-C как "C + Smalltalk OO"
1984Книга Object-Oriented Programming: An Evolutionary Approach
1988NeXT лицензирует Objective-C для NeXTSTEP OS
1996Apple покупает NeXT — Objective-C становится основой macOS разработки
2001macOS X (Cocoa) — AppKit, Foundation
2007iPhone SDK — Objective-C + UIKit
2011ARC (Automatic Reference Counting) — конец эры ручного retain/release для большинства
2014Apple представляет Swift — язык по умолчанию для новых проектов
2014+Mixed targets, bridging headers, @objc в Swift
2020sSwiftUI доминирует в 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
ЭтапПродукт
NeXTNeXTSTEP, Interface Builder, AppKit
Apple 1996ОСнова macOS X
2007UIKit — мобильный вариант 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

ЭраУправление памятью
До 2011MRC — разработчик считает retain count
2011+ARC — компилятор вставляет вызовы
SwiftARC + 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-CSwift
Синтаксис[ ], @ directivesсовременный, типобезопасный
Nullnil для объектовOptionals
Новые API Applelegacy headersSwift-first
Interop@objc, bridging headerвызов Obj-C из Swift
ПроизводительностьПроверенный runtimeОптимизации, value types
ОбучениеКривая для новичковПроще старт

Apple поддерживает оба языка; новый UI-код — Swift, фреймворки экспортируют Obj-C headers для совместимости. Подробнее — Swift — о разделе.


Миграционные стратегии (обзор)

Типичный путь в legacy-проекте:

  1. Новые файлы — Swift, Generated-Interface Header для Obj-C callers.
  2. Критичные hot paths оставить в Obj-C до профилирования.
  3. @objc на Swift class для видимости в Obj-C.
  4. Постепенная замена 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–2000sManual retain/release
macOS GC (отменён)Experimental GC
2011+ ARCCompiler 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 buildsbindings

Новые 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
1988NeXT лицензирует 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Коллекции, строки, даты
AppKitmacOS UI
UIKitiOS UI
Core DataPersistence

Эволюция компилятора

ЭраКомпилятор
1980s–2000sgcc + 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 на этапе компиляции.

ТерминARCMRC
ВладениеАвтоматическиretain/release
Core Foundation__bridgeExplicit 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 LoveStepstone
Chris LattnerLLVM, clang, Swift

Хронология

1980s Stepstone → 1988 NeXT → 1996 Apple → 2007 iPhone → 2011 ARC → 2014 Swift

Упражнения

  1. Постройте timeline на одной странице с датами из таблицы выше.
  2. Найдите MRC-код (release в dealloc) на GitHub.
  3. Объясните nil messaging тремя примерами.
  4. Сравните category и Swift extension.
  5. Опишите mixed target и bridging header.
  6. Связь с Smalltalk — параграф.
  7. Найдите .mm (Obj-C++) файл в open source.
  8. Сравните GCD block с Swift closure.
  9. WWDC год Swift — что изменилось для новых проектов?
  10. Прочитайте 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 — после практики в первой программе.