Objective-C
Objective-C — это объектно-ориентированный язык программирования общего назначения, основанный на парадигме обмена сообщениями, расширяющий язык C. Разработан в начале 1980-х годов компанией Stepstone (изначально — Productivity Products International) и впоследствии стал основным языком для операционных систем NeXTSTEP, а затем и macOS и iOS компании Apple Inc. Objective-C сочетает синтаксис C с семантикой объектно-ориентированного программирования, заимствованной из языка Smalltalk.
История
Создание и ранние годы
Язык был создан Брэдом Коксом и Томом Лавом в 1983 году. Кокс, работавший в компании Stepstone, стремился объединить эффективность языка C с гибкостью объектно-ориентированного подхода Smalltalk. В 1986 году была опубликована книга Кокса «Object-Oriented Programming: An Evolutionary Approach», в которой описывался язык Objective-C. Первая версия компилятора была выпущена компанией Stepstone в 1986 году.
Принятие NeXT
В 1988 году компания NeXT, основанная Стивом Джобсом, приобрела лицензию на Objective-C и сделала его основным языком для операционной системы NeXTSTEP. В 1992 году NeXT выпустила среду разработки Project Builder и библиотеку Foundation Kit, которые стали основой для будущей экосистемы Apple. В 1994 году компания NeXT выпустила спецификацию OpenStep — объектно-ориентированной операционной системы, реализованной на Objective-C.
Эра Apple
В 1996 году Apple Inc. приобрела NeXT, и в 1997 году Objective-C был объявлен основным языком для разработки под операционные системы Apple. В 2001 году с выходом macOS (тогда — Mac OS X) язык стал основным для создания приложений для этой платформы. В 2007 году с выходом iPhone OS (позже — iOS) Objective-C стал языком разработки для мобильных устройств Apple.
В 2014 году Apple представила новый язык Swift, который стал постепенно вытеснять Objective-C. Однако, благодаря обратной совместимости и огромной кодовой базе, Objective-C остаётся в активном использовании, особенно для поддержки устаревших проектов и библиотек.
Особенности языка
Синтаксис и парадигма
Objective-C является строгим надмножеством C: любой корректный код на C является корректным кодом на Objective-C. Основное отличие — добавление объектно-ориентированных конструкций, основанных на обмене сообщениями (message passing), а не на вызове методов, как в C++ или Java.
Синтаксис вызова метода в Objective-C уникален:
``objectivec [object methodName:argument1 secondArgument:argument2]; ``
Динамическая типизация
Objective-C поддерживает динамическую типизацию через тип id, который может указывать на любой объект. Это позволяет отправлять сообщения объектам, не зная их точного типа во время компиляции. Проверка типов и разрешение методов происходят во время выполнения.
Категории
Категории (categories) позволяют добавлять методы к существующим классам без создания подклассов. Это мощный механизм расширения функциональности, особенно для классов из системных библиотек.
Протоколы
Протоколы (protocols) — это аналог интерфейсов в Java или C#. Они определяют набор методов, которые класс может реализовать. Протоколы могут быть как обязательными, так и опциональными.
Управление памятью
Исторически Objective-C использовал ручное управление памятью с подсчётом ссылок (retain/release). С 2011 года с выходом Automatic Reference Counting (ARC) управление памятью стало автоматизированным, хотя ручной режим остаётся доступным.
Классификация и версии
По стандартам
Objective-C не имеет формального стандарта ISO, но существует несколько реализаций:
- Apple Objective-C — реализация от Apple, используемая в macOS и iOS.
- GNUstep Objective-C — открытая реализация, совместимая с библиотеками GNUstep.
- Clang Objective-C — реализация на основе компилятора Clang, используемая Apple и другими проектами.
По версиям
- Objective-C 1.0 — базовая версия, использовавшаяся в NeXTSTEP.
- Objective-C 2.0 — версия, выпущенная Apple в 2006 году с выходом Mac OS X Leopard. Включала:
- Сборку мусора (Garbage Collection) — позже заменена на ARC.
- Быстрое перечисление (Fast Enumeration).
- Свойства (Properties) с синтаксисом
@property. - Литералы для объектов (например,
@{},@[]). - Objective-C с ARC — версия, выпущенная в 2011 году с Xcode 4.2. Включала автоматический подсчёт ссылок.
Устройство и компиляция
Компилятор
Основным компилятором для Objective-C является Clang, входящий в состав Xcode. Clang транслирует код Objective-C в промежуточное представление LLVM, которое затем компилируется в машинный код. Ранее использовался компилятор GCC.
Среда выполнения (Runtime)
Objective-C имеет динамическую среду выполнения (runtime), которая обеспечивает:
- Диспетчеризацию сообщений.
- Динамическое создание классов.
- Интроспекцию объектов (reflection).
- Управление памятью.
Runtime реализован в виде библиотеки libobjc (для Apple) или libobjc2 (для GNUstep).
Библиотеки
- Foundation Kit — базовая библиотека, предоставляющая классы для работы с данными, строками, коллекциями, файловой системой.
- Application Kit (AppKit) — библиотека для создания графического интерфейса под macOS.
- UIKit — библиотека для создания интерфейса под iOS и tvOS (с 2019 года — iPadOS).
- Core Data — фреймворк для управления объектными моделями данных.
- Cocoa — общее название для Foundation и AppKit.
Применение
Разработка под macOS и iOS
Основная область применения Objective-C — создание приложений для операционных систем Apple. До 2014 года это был единственный язык для разработки под iOS. Многие классические приложения, такие как Xcode, Safari, Mail, написаны на Objective-C.
Кроссплатформенная разработка
Благодаря проекту GNUstep, Objective-C может использоваться для разработки приложений под Linux и Windows. Однако эта экосистема значительно менее популярна.
Фреймворки и библиотеки
Objective-C используется в ряде популярных библиотек:
- AFNetworking — библиотека для сетевых запросов.
- CocoaPods — менеджер зависимостей для проектов на Objective-C и Swift.
- ReactiveCocoa — фреймворк для функционального реактивного программирования.
Примеры кода
Определение класса
```objectivec // MyClass.h @interface MyClass : NSObject @property (nonatomic, strong) NSString *name;
- (void)greet;
@end
// MyClass.m @implementation MyClass
- (void)greet {
NSLog(@"Hello, %@!", self.name); } @end ```
Использование
``objectivec MyClass *obj = [[MyClass alloc] init]; obj.name = @"World"; [obj greet]; // Вывод: Hello, World! ``
Интересные факты
- Objective-C был одним из первых языков, внедривших концепцию «категорий» для расширения классов.
- Синтаксис вызова методов в квадратных скобках часто критикуется за громоздкость, но он обеспечивает чёткое разделение между вызовом сообщения и вызовом функции C.
- Язык Swift, созданный Apple, не является прямым наследником Objective-C, но имеет полную совместимость с ним, позволяя использовать Objective-C-код в проектах на Swift.
- В 2016 году Apple объявила, что Swift станет «основным» языком для разработки, но Objective-C продолжает поддерживаться и обновляться.
Критика
Objective-C подвергается критике за:
- Громоздкий синтаксис — длинные имена методов и квадратные скобки делают код менее читаемым по сравнению с современными языками.
- Отсутствие пространств имён — все классы находятся в глобальном пространстве, что приводит к конфликтам имён (решается префиксами, например,
NSдля Foundation). - Слабая поддержка функционального программирования — в отличие от Swift, Objective-C не имеет встроенных средств для работы с замыканиями в полной мере (хотя блоки (blocks) были добавлены в 2009 году).
- Динамическая типизация — может приводить к ошибкам времени выполнения, которые не обнаруживаются на этапе компиляции.
Источники
- Cox, Brad J. «Object-Oriented Programming: An Evolutionary Approach». Addison-Wesley, 1986.
- Apple Inc. «The Objective-C Programming Language». Apple Developer Documentation, 2006.
- Kochan, Stephen G. «Programming in Objective-C». Addison-Wesley, 2011.
- GNUstep Project. «Objective-C Features». GNUstep Documentation, 2023.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →