Мой дядя самых честных правил программ исходники за так ...

13 сент. 2011 г.

Мини-гайд по началам изучения Objective C

Опять же, собрано для себя.

Введение

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

Для людей с бэкграундом любого обьектно-ориентированного языка все концепции очень быстро понимаются и изучаются методом практического программирования.

Инструменты

Как это не странно, но каких-либо удобных инструментов под платформу Windows для этого языка не существует не найдено мной, к сожалению.

Поэтому как обычно, пришлось брать стандартный GCC (с поддержкой Objective C) и MakeFile в руки. Для редактирования текстов и исполнения программ, я уже который год подряд использую прекрасный, хоть уже слегка и устаревший редактор Scite.

Скриншот: Редактор Scite и программа на Objective C

Примечание: Официальную версию 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.

Литература

7 комментариев:

  1. Слушай, ну ты вот человек испорченный .net-ом, Resharper'ом, LINQ, экстеншен-методами, сборщиком мусора, и прочим мега удобным стаффом.
    Тебе действительно нравится работать с Objective C, или просто хочется денег?
    Самому приходится иметь дело с Delphi, чтобы денег срубить, но после C# эти недоязыки вызывают только рвоту.

    ОтветитьУдалить
  2. Привет! Жаль, что ты не представился, мой анонимный читатель.

    Я скорее человек, испорченный Хаскелем, чем дотнетом. Так, что да-а, если бы мне пришлось разрабатывать под iOS, то я бы скорее всего выбрал MonoTouch и начал с него.

    А, сейчас, я занимаюсь Objective C скорее в рамках расширения кругозора, чем "срубить бабла".
    Да и язык, в связи со своим родством со SmallTalk - прародителем ООП - скорее вызывает положительные эмоции, хотя конечно, синтаксис и управление памятью оставляют желать лучшего :-)

    Удачи!

    ОтветитьУдалить
  3. Не совсем поняла, в итоге можно создать программу под windows, а потом буквально изменить названия заголовочных файлов и пересобрать под macOS ?

    ОтветитьУдалить
  4. Хотел бы услышать ответ на вопрос, который задал предыдущий аноним ))

    ОтветитьУдалить
    Ответы
    1. Ответить тут сложно. В общем случае, конечно нельзя. В самых простых случах и синтасис и рантайм очень похожи и можно обойтись простыми заменами.
      Главное, что надо понять и осознать - программирование - это не только синтаксис и базовый рантайм - это куча и очень большая куча библиотек, которые реализуют функционал, на основе которых вы и строите свою программу. И поэтому построить программу и скомпилировать её даже просто другим компилятором практически невозможно.

      P.S. Я осознаю, что я для вас говорю на непонятном языке. Многие эти вещи и концепции, о которых я говорю в своём блоге, являются базовыми понятиями инженера-программиста и я стараюсь опираться на уже известные понятия, чтобы объяснить и показать новые. Учиться на основе моих записей чему-то совершенно новому для вас, я думаю нецелесообразно. Но вдруг получится?

      Удалить
    2. Я лично не понял анонимного оратора. С#, 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).

      Удалить
  5. А кто-нибудь GNUSTEP под Windows пользовался? Там даже визуальный редактор есть для Objectiv C.

    ОтветитьУдалить

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