Вот небольшой список вещей, которые, по моему опыту, делают Objective-C мощным и интересным языком программирования.

Классы - это объекты

Каждый класс является экземпляром метакласса, автоматически создаваемого и управляемого средой выполнения. Мы можем определять методы класса, передавать классы в качестве аргументов, помещать их в коллекции и так далее. Чтобы создать объект, мы просто отправляем сообщение классу, который хотим создать. Не нужно изобретать «заводскую» систему. Нет необходимости в конкретном механизме конструктора на уровне языка. Это помогает сохранить простой и мощный язык. И, кстати, метаклассы тоже являются объектами!

Динамический набор текста

Как и в Ruby, Python, Smalltalk, Groovy ... Чрезвычайно полезно, потому что мы не всегда заранее знаем, какими будут наши объекты во время выполнения. Динамическая типизация в Objective-C проста в использовании. Например, здесь объявляется переменная, которая может содержать ссылку на объект:

id myObject;

Необязательная статическая типизация

Тем не менее, Objective-C также поддерживает статическую типизацию. Лучшее из обоих миров.

Это объявляет переменную, которая может содержать ссылку на объект класса (или подкласса) NSView:

NSView *myObject;

Категории

Категории позволяют нам определять новые методы и добавлять их в классы, для которых у нас нет исходного кода (например, стандартные классы Cocoa, предоставляемые Apple). Это позволяет легко расширять классы, не прибегая к подклассам. Чрезвычайно полезно для адаптации существующих классов к требованиям фреймворков, которые мы хотим использовать или создавать.

Отправка сообщения

Мы взаимодействуем с объектами, отправляя им сообщения. Часто у получателя сообщения будет метод, который напрямую соответствует сообщению (то есть имеет то же имя или, в терминах Objective-C, тот же селектор). В этом случае будет вызван метод. Но это не единственный возможный результат, поскольку объект может выбрать обработку сообщения другими способами, например, перенаправить его другому объекту, передать его ряду объектов, проанализировать его и применить настраиваемую логику и т. Д.
Очень могущественный…

Выразительный синтаксис сообщения

Шаблоны сообщений в Objective-C похожи на предложения на естественном языке с дырками в них (с префиксом двоеточия). Когда мы пишем код, который отправляет сообщение объекту, мы заполняем дыры фактическими значениями, создавая осмысленное предложение. Такой способ обозначения сообщений заимствован из Smalltalk и делает код очень выразительным.

Пример, отправка сообщения в упорядоченную коллекцию с просьбой вставить данный объект по индексу 10:

[myCollection insert:myObject atIndex:10]

Выражения отправки сообщения можно читать как предложение, в котором получатель является темой, а сообщение - остальной частью предложения (например, действие, которое мы хотим, чтобы получатель выполнял): «myCollection insert myObject at index 10».

Самоанализ

Самостоятельно исследовать объекты легко. Например, мы можем запросить у объекта его класс следующим образом:

[myObject class]

Определите, есть ли у объекта метод «foo»:

[myObject respondsToSelector:@selector(foo)]

Спросите у объекта сигнатуру его метода «foo»:

[myObject methodSignatureForSelector:@selector(foo)]

Спросите класс, является ли он подклассом другого класса:

[class1 isSubclassOfClass:class2]

И так далее…

Динамическое время выполнения

Objective-C имеет динамическое время выполнения. Он позволяет создавать сообщения во время выполнения, динамически создавать классы, динамически добавлять методы к существующим классам, изменять реализации методов и т. Д.

Хороший пример того, чего можно достичь с помощью самоанализа и динамизма Objective-C, вы можете найти в этой статье, которую я написал о браузере графических объектов, предоставляемом F-Script.

Автоматический сбор мусора

Автоматический сборщик мусора работает в собственном потоке одновременно с кодом приложения. Он использует модель поколений для повышения своей эффективности за счет нацеливания на приоритетные зоны памяти, которые с большей вероятностью будут мусором. Он работает для объектов, а также для необработанных блоков памяти C, выделенных с помощью NSAllocateCollactable() и подобных функций. malloc() работает как обычно, обеспечивая контроль над памятью, не управляемой сборщиком.

Сборщик мусора - это дополнительная услуга: вы можете не использовать ее в своем приложении и вместо этого полагаться на систему подсчета ссылок. Эта система включает в себя довольно оригинальный механизм отложенного выпуска, который значительно снижает нагрузку на ручной подсчет ссылок.

Обратите внимание, что на момент написания этой статьи автоматический сборщик мусора недоступен на iPhone .

C внутри

Objective-C в первую очередь является объектно-ориентированным расширением языка C и представляет собой надмножество C. Это означает, что доступна чистая мощь C и что библиотеки C могут быть доступны напрямую (как вы знаете, существует довольно много из них есть в наличии!). Кроме того, это создает симбиотические отношения между языком и операционной системой, поскольку Mac OS X, которая является системой UNIX, в основном написана на C, а для частей верхнего уровня - на Objective-C.

C ++ свободно

Objective-C не только является надмножеством C, но также может понимать и вызывать код C ++. Используемый в этой конфигурации язык называется Objective-C ++ и позволяет смешивать код Objective-C и C ++ в одних и тех же операторах кода. Он также позволяет напрямую использовать библиотеки C ++.

Простота

Объектная система Objective-C, вдохновленная Smalltalk, тяготеет к простоте. Многие функции, которые делают языки сложными (шаблоны, перегрузка, множественное наследование и т. Д.), Просто отсутствуют в Objective-C, который предлагает более простые модели программирования, использующие преимущества его динамической природы.

Доступ к технологиям Apple

Каждая новая версия Mac OS X, а теперь и iPhone OS, полна интересных новых технологий, которые доступны для игры прямо из Objective-C. Это значительно делает использование Objective-C интересным.