Открыть сервис

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 →