Опять же, собрано для себя.
Введение
Язык Objective C, на первый взгляд, очень простой, чтобы начать программировать – достаточно базового знания Cи и слышать что-нибудь про SmallTalk, где вызов метода – это посылка сообщения.
Для людей с бэкграундом любого обьектно-ориентированного языка все концепции очень быстро понимаются и изучаются методом практического программирования.
Инструменты
Как это не странно, но каких-либо удобных инструментов под платформу Windows для этого языка не существует не найдено мной, к сожалению.
Поэтому как обычно, пришлось брать стандартный GCC (с поддержкой Objective C) и MakeFile в руки. Для редактирования текстов и исполнения программ, я уже который год подряд использую прекрасный, хоть уже слегка и устаревший редактор Scite.
Примечание: Официальную версию Scite можно взять тут. Однако, самой подходящей версией Scite, сейчас, видимо является – русская сборка, которая содержит ряд полезных дополнений к оригинальной версии и поддерживает скриптовый язык Lua.
И далее, компилировать GCC с поддержкой Objective-C:
gcc.exe -x objective-c -lobjc -I$(OBJC_INC) -L$(OBJC_LIB) *.m $(OBJC_BASELIBS) -o Main.exe
Синтаксис
Ух, это просто сказка.
По сути, вы можете взять любую Си-программу и откомпилировать её компилятором Objective C. Полная обратная совместимость.
А всё дальнейшее – это расширения.
По сути, их несколько: новые ключевые слова, которые начинаются с символа ‘@’ (коммерческое At), посылка сообщения, обрамляемое квадратными скобками, и всё. Остальное делает рантайм – то есть библиотеки.
Например:
#import <stdio.h> #import <objc/Object.h> @interface MyObject : Object { int field; } -init; -(void) Hello: (char*) s; @end @implementation MyObject -init { [super init]; field = 5; } -(void) Hello: (char*) s { printf("%s\n", s); } @end int main(void) { MyObject* myObjectInstance = [[MyObject alloc] init]; [myObjectInstance Hello: "Hello, World!"]; [myObjectInstance free]; }Разбираем, по очереди.
#import – замена стандартного, и набившего всем C++-сникам оскомину, #include, – отличие с том, что #import включается ровно один раз при компиляции (да-да, та самая #pragma once).
objc/Object.h – базовый объект для всех объектов языка Objective-C. Он не является обязательным, но управление памятью реализовано в нём.
@interface – первое новое ключевое слово – это объявление нового объекта, содержит во-первых поля объекта (обычная C-структура) и объявления методов объекта в специфическом стиле.
@implementation – реализация объявленных в @interface методов объекта.
И самое интересное – это посылка сообщений.
MyObject * – указатель на объект.
[ObjectInstance Message: Parameter]
Итак, это обычные квадратные скобки, которые обозначают посылку сообщения Message некоторому объекту ObjectInstance. Сообщение может содержать упакованные параметры Parameter.
Суть примерно та же, что и в SmallTalk. Объекту можно посылать любые сообщения, обработаны будут только те, которые явно поддерживает объект.
В моём примере, происходит посылка четырёх сообщений:
1) [MyObject alloc] – посылка сообщения классу MyObject о выделении памяти и создании объекта этого типа.
Примечание: Да, да, посылка сообщения происходит именно классу объектов. Классы объектов – являются самостоятельными объектами и все создаются во время старта приложения. Соответственно, возможно им посылать сообщения, и доступна интроспекция.
2) Возвращаемому результату обработки сообщения (это указатель на созданный объект) посылается сообщение init, которое в языке Objective C является соглашением об инициализации объекта (конструктор в терминах других языков).
3) [myObjectInstance Hello: "Hello, World!"] – посылка сообщения Hello c параметром.
4) [myObjectInstance free] – освобождение памяти, ранее выделенной под объект через cообщение alloc.
Примечание: Строго говоря, вызов free – необязательно приводит к освобождению памяти, в связи с тем, что в Objective C для управления памятью используется подсчёт ссылок, а в некоторых случаях и GC.
Рантайм
Существует два немного различающихся рантайма: входящий в поставку GCC и от Apple. Отличия у них незначительные. Главное различие – это политика именования заголовочных файлов и классов объектов у Apple: везде добавляется префикс NS.
Примечание: NS – это сокращение от названия NextStep, историческое название предшественника сегодняшней MAC OS. Набор библиотек для Objective C под Windows доступен в пакете GNUStep.
Примеры:
GCC: #import <objc/Object.h> Apple: #import <Foundation/NSObject.h>
Аналогичный эппловскому набор рантайм-библиотек (в пределах небольших изменений) поставляется с библиотеками GNUStep.
Слушай, ну ты вот человек испорченный .net-ом, Resharper'ом, LINQ, экстеншен-методами, сборщиком мусора, и прочим мега удобным стаффом.
ОтветитьУдалитьТебе действительно нравится работать с Objective C, или просто хочется денег?
Самому приходится иметь дело с Delphi, чтобы денег срубить, но после C# эти недоязыки вызывают только рвоту.
Привет! Жаль, что ты не представился, мой анонимный читатель.
ОтветитьУдалитьЯ скорее человек, испорченный Хаскелем, чем дотнетом. Так, что да-а, если бы мне пришлось разрабатывать под iOS, то я бы скорее всего выбрал MonoTouch и начал с него.
А, сейчас, я занимаюсь Objective C скорее в рамках расширения кругозора, чем "срубить бабла".
Да и язык, в связи со своим родством со SmallTalk - прародителем ООП - скорее вызывает положительные эмоции, хотя конечно, синтаксис и управление памятью оставляют желать лучшего :-)
Удачи!
Не совсем поняла, в итоге можно создать программу под windows, а потом буквально изменить названия заголовочных файлов и пересобрать под macOS ?
ОтветитьУдалитьХотел бы услышать ответ на вопрос, который задал предыдущий аноним ))
ОтветитьУдалитьОтветить тут сложно. В общем случае, конечно нельзя. В самых простых случах и синтасис и рантайм очень похожи и можно обойтись простыми заменами.
УдалитьГлавное, что надо понять и осознать - программирование - это не только синтаксис и базовый рантайм - это куча и очень большая куча библиотек, которые реализуют функционал, на основе которых вы и строите свою программу. И поэтому построить программу и скомпилировать её даже просто другим компилятором практически невозможно.
P.S. Я осознаю, что я для вас говорю на непонятном языке. Многие эти вещи и концепции, о которых я говорю в своём блоге, являются базовыми понятиями инженера-программиста и я стараюсь опираться на уже известные понятия, чтобы объяснить и показать новые. Учиться на основе моих записей чему-то совершенно новому для вас, я думаю нецелесообразно. Но вдруг получится?
Я лично не понял анонимного оратора. С#, Mono - э?
УдалитьЛейтенант педантичность во мне требует сказать, что опыта у меня очень мало. Однако же я успел сложить весьма отрицательное впечатление о С#, а точнее о его неотъемлемой части - .Net Framework, документация к которой (по сравнению с Apple Developer Library) - скудна (no, really), производительность - хромает (последний раз имел дело с .Net во времена Windows Mobile 6. Писать было и вправду удобно, после делфи то, но как же оно лагает, матерь божья). Вообще сложилось чувство, что весь фреймворк писался людьми, которые о ограниченности ресурсов слыхом не слыхивали. .Net приложения под WM6 - это было кошмаром своего времени. Я очень трепетно отношусь к оптимизации и .Net с Java надух не переношу. Я осознаю, что сообщения в Obj-C - дорогостоящее удовольствие, но они с радостью заменяются в чувствительных местах сишными фукнциями или новомодной штукой - блоками. Впрочем тормознутость .Net остается для меня до сих пор загадкой (чего не могу сказать о Java) и как следствие - нелюбовь к C#. Ну а еще у С# статичная типизация и отсутствие поддержки множественного наследования (say what!? только что с википедии прочитано. Это вообще как? Сразу вспоминается картинка - мозг с джетпаком, nothing to do here).
А кто-нибудь GNUSTEP под Windows пользовался? Там даже визуальный редактор есть для Objectiv C.
ОтветитьУдалить