Создание программ для Mac OS X. Часть 1: вступление и Objective-C

    Вступление


    Я думаю все слышали про Mac OS X как операционную систему для дизайнеров и домохозяек. Но хочется рассказать про средства разработки для OS X, а то хорошие программы пишут, а на чем — никто не знает.

    Сразу скажу, что не буду рассказывать про кроссплатформенные фреймворки и тулкиты(такие как Qt) или про создание консольных приложений, я расскажу про то, что в плане создания приложений отличает Mac OS X от других операционных систем, а именно — фреймворк Cocoa. Оговорюсь сразу, что буду стараться избегать сравнений с другими фреймворками, я хочу просто рассказать про Cocoa.

    Заглянем немного в историю. Mac OS X — дальнейшее развитие ОС NextSTEP. NextSTEP была первой ОС в которой очень широко использовался язык Objective-C, на нем была написана большая библиотека готовых объектов, причем как и обычные типы данных — строки, массивы, словари, так и объекты, используемые для построения GUI приложений. Поэтому, большая часть приложений под NextSTEP писалась на Objective-C с использованием готовых объектов. Эта самая библиотека и переросла в Cocoa framework.

    Но включать в новую ОС почти незнакомый никому API было бы крайне плохим решением, поэтому добавили еще 2: Classic и Carbon.

    Classic создан для того, чтобы запускались приложения Mac OS 9, на данный момент рассматривать его бессмысленно, т.к. после перехода на процессоры фирмы Intel по понятным причинам Classic был выкинут из системы.

    Carbon был создан чтобы легко перенести приложения из Mac OS 9 в OS X, с возможностью добавить к уже готовому коду программы новую функциональность, доступную только в десятке. Как ни странно, но много приложений до сих пор написаны на Carbon(например MS Office for Mac и некоторые продукты Adobe).

    На данный момент фреймворки Carbon и Cocoa развиваются паралельно, но со следующего релиза Mac OS X будут развивать только Cocoa.

    Основным языком разработки под Cocoa является Objective-C, а поскольку в дальнейшем все примеры будут идти на этом языке, то впервой части я расскажу именно про него. Но если вы уже владеете Python или Ruby, то изучать Objective-C вам не надо, в XCode 3.0(срада разработки, о ней в следующей части) биндинги для этих языков «искаропки».

    Язык программирования Objective-C


    Помимо широкого известного и распространенного объектного расширения языка С — языка С++ — есть и другое его расширение — язык Objective-C, обладающий огромной простотой, полной совместимостью с языком С и очень мощной и выразительной объектной моделью, заимствованной из языка Smalltalk.

    Язык был придуман Брэдом Коксом (Brad Cox) в начале 80-х годов прошлого века. Целью Кокса было создание языка, поддерживающего концепцию software IC. Под этой концепцией понимается возможность собирать программы из готовых компонент (объектов), подобно тому как сложные электронные устройства могут быть легко собраны из набора готовых интегральных микросхем (IC, integrated curcuits). При этом такой язык должен быть достаточно простым и основанным на языке С, чтобы облегчить переход разработчиков на него.

    Одной из целей было также создание модели, в которой сами классы также являются полноценными объектами, поддерживалась бы интроспекция и динамическая обработка сообщений.

    Получившийся в результате язык Objective-C оказался крайне прост — его освоение у С-программиста займет всего несколько дней. Он является именно расширением языка С — в язык С просто добавлены новые возможности для объектно-ориентированного программирования. При этом любая программа на С является программой и на Objective-C (для языка С++ это не верно).

    Еще одной из особенностей языка является то, что он message-oriented в то время как С++ — function-oriented. Это значит, что в нем вызовы метода интерпретируются не как вызов функции (хотя к этому обычно все сводится), а именно как посылка сообщения (с именем и аргументами) объекту, подобно тому, как это происходит в Smalltalk-е. Такой подход дает целый ряд плюсов — так любому объекту можно послать любое сообщение. Объект может вместо обработки сообщения просто переслать его другому объекту для обработки (так называемое делегирование), в частности именно так можно легко реализовать распределенные объекты (т.е. объекты находящиеся в различных адресных пространствах и даже на разных компьютерах). Привязка сообщения к соответствующей функции происходит непосредственно на этапе выполнения.

    Язык Objective-C поддерживает работу с метаинформацией — так у объекта непосредственно на этапе выполнения можно спросить его класс, список методов (с типами передаваемых аргументов) и instance-переменных, проверить, является ли класс потомком заданного и поддерживает ли он заданный протокол и т.п.

    В языке есть нормальная поддержка протоколов (т.е. понятие интерфейса объекта и протокола четко разделены). Для объектов поддерживается наследование (не множественное), для протоколов поддерживается множественное наследование. Объект может быть унаследован от другого объекта и сразу нескольких протоколов (хотя это скорее не наследование протокола, а его поддержка).

    На данный момент язык Objective-C поддерживается компилятором gcc. Довольно много в языке перенесено на runtime-библиотеку и сильно зависит от нее. Вместе с компилятором gcc поставляется минимальный вариант такой библиотеки. Также можно свободно скачать runtime-библиотеку от компании Apple: Apple's Objective-C runtime. Эти две runtime-библиотеки довольно похожи (в основном отличие заключается в именах методов), хотя далее я буду ориентироваться на runtime-библиотеку от компании Apple.

    Синтаксис языка


    В языке Objective-C для обозначения объектов используется специальный тип id. Переменная типа id фактически является указателем на произвольный объект. Для обозначения нулевого указателя на объект используется константа nil. Кстати про id: движок игры Doom разрабатывался на рабочих станциях Next, так что может есть связь между типом id и названием idSoftware.

    При этом вместо id можно использовать и более привычное обозначение с явным указанием класса. В частности последнее позволяет компилятору осуществлять некоторую проверку поддержки сообщения объектами — если компилятор из типа переменной не может сделать вывод о поддержке объектом данного сообщения, то он выдаст предупреждение (а не ошибку !). Тем самым язык поддерживает проверку типов, но в нестрогой форме (т.е. найденные несоответствия возвращаются как предупреждения, а не ошибки).

    Для посылки сообщений используется следующий синтаксис:
    [receiver message];

    Сообщение может также содержать параметры:
    [myRect setOrigin:30.0 :50.0];
    В этом примере именем метода (сообщения) является setOrigin::. Обратите внимание, что каждому передаваемому аргументу соответствует ровно одно двоеточие. При этом в приведенном примере первый аргумент имеет метку (текст перед двоеточием), а второй — нет.

    Язык Objective-C позволяет снабжать метками каждый аргумент, что заметно повышает читаемость кода и снижает вероятность передачи неправильного параметра.
    [myRect setWidth:10.0 height:20.0];
    В этом примере в качестве имени сообщения выступает setWidth:height:.

    Также поддерживается возможность передачи произвольного количества аргументов в сообщении:
    [myObject makeGroup: obj1, obj2, obj3, obj4, nil];

    Как и функции, сообщения могут возвращать значения, при этом в отличии от языка С, типом возвращаемым по умолчанию значения является id.
    float area = [myRect area];

    Результат одного сообщения можно сразу же использовать в другом сообщении:
    [myRect setColor:[otherRect color]];

    Как уже говорилось, в Objective-C классы сами являются объектами. Основной задачей таких объектов (называемых class objects) является создание экземпляров данного класса. При этом само имя класса играет двойную роль — с одной стороны оно выступает как тип данных (т.е. он может быть использован для описания указателей на объекты данного класса). А с другой стороны имя класса может выступать в качестве объекта, которому посылается сообщение ( в сообщениях имя класса может принимать участие только как receiver). В языке Objective-C нет встроенного типа для булевских величин, поэтому обычно такой тип вводится искусственно. Далее я буду для логических величин использовать тип BOOL с возможными значениями YES и NO(ИМХО более понятней, но не так “политкорректно” как true/false).

    Создание новых классов


    Все новые директивы компилятору в языке Objective-C начинаются с символа @. Как и в С++ описание класса и его реализация разделены (обычно описание помещается в заголовочные файлы с расширением h, а реализации — в файлы с расширением m).
    Ниже приводится общая структура описания нового класса:
    @interface ClassName: SuperClass
    {
    instance variable declarations
    }
    method declarations
    end


    В версии runtime от Apple все классы имеют общего предка — класс NSObject, содержащий целый ряд важных методов. Описание переменных ничем не отличается от описания переменных в структурах в языке С:
    @interface Rect: NSObject
    {
    float width;
    float height;
    BOOL isFilled;
    NSColor * color;
    }
    end


    Каждое описание начинается со знака плюс или минус. Знак плюс обозначает, что данный метод является методом класса (т.е. его можно посылать только class object'у, а не экземплярам данного класса). Фактически методы класса являются аналогами статических методов в классах в языке С++. Знак минус служит для обозначения методов объектов — экземпляров данного класса. Обратите внимание, что в Objective-C все методы являются виртуальными, т.е. могут быть переопределены.

    Ниже приводятся описания возможных методов для класса Rect.
    @interface Rect: NSObject
    {
    float x, y;
    float width;
    float height;
    BOOL isFilled;
    NSColor * color;
    }
    + newRect;
    — (void) display;
    — (float) width;
    — (float) height;
    — (float) area;
    — (void) setWidth: (float) theWidth;
    — (void) setHeight: (float) theHeight;
    — (void) setX: (float) theX y: (float) theY;
    end


    Обратите внимание, что имя метода может совпадать с именем instance-переменной данного класса (например, width и heigh).
    Тип возвращаемого методом значения указывается в круглых скобках сразу же после знака плюс или минус (но перед названием метода). Если тип не указан, то считается, что возвращается значение типа id. Далее идет имя метода, где после каждого двоеточия задается тип аргумента (в круглых скобках) и сам аргумент. Язык Objective-C позволяет для аргументов метода задавать также один из следующих описателей — oneway, in, out, inout, bycopy и byref. Данные описатели служат для задания направления передачи данных и способа передачи.

    Метод, принимающий произвольное количество параметров, может быть описан следующим образом:
    — makeGroup: (id) object, ...;

    Для подключения заголовочного файла в Objective-C вместо директивы #include используется директива #import, полностью аналогичная #include, но гарантирующая что данных файл будет подключен всего один раз.

    Реализация методов класса выглядит следующим образом:
    #import «ClassName.h»
    @implmentation ClassName
    method implementations
    end


    Ниже приводится пример реализации методов класса Rect, описанного ранее.
    #import «Rect.h»

    @implmentation Rect

    + newRect {
    Rect * rect = [[Rect alloc] init];
    [rect setWidth: 1.0f];
    [rect setHeight: 1.0f];
    [rect setX: 0.0f y: 0.0f];
    }
    — (float) width { return width; }
    — (float) height { return height; }
    — (float) area { return [self width] * [self height]; }
    — (void) setWidth: (float) theWidth { width = theWidth; }
    — (void) setHeight: (float) theHeight { height = theHeight; }
    — (void) setX: (float) theX y: (float) theY {
    x = theX;
    y = theY;
    }
    end


    Как видно из примера выше, в методах доступны все instance-переменные. Однако, как и в С++, есть возможность управлять видимостью переменных (видимостью методов управлять нельзя) при помощи директив private, protected и public (действующих полностью аналогично языку С++).

    Как работает механизм сообщений


    Компилятор переводит каждую посылку сообщения, т.е. конструкцию вида [object msg] в вызов функции objc_msgSend.

    Эта функция в качестве своего первого параметра принимает указатель на объект-получатель сообщения, в качестве второго параметра выступает т.н. селектор, служащий для идентификации посылаемого сообщения. Если в сообщении присутствуют аргументы, то они также передаются objc_msgSend как третий, четвертый и т.д. параметры. Далее происходит поиск подходящей функции среди функций данного класса, если такой не найдено, то среди функций родительского класса, если и там не найдено, то среди функций родительского класса родительского класса( :-) ) и т.д. Если метод (т.е. соответствующая ему функция) находится, то осуществляется его вызов с передачей всех необходимых аргументов.

    В противном случае объекту дается последний шанс обработать сообщение перед вызовом исключения — селектор сообщения вместе с параметрами «заворачивается» в специальный объект типа NSInvocation и объекту посылается сообщение forwardInvocation:, где в качестве параметра выступает объект класса NSInvocation.

    Если объект поддерживает forwardInvocation:, то он может либо сам обработать посылаемое сообщение, либо переслать другому объекту для обработки:
    — (void)forwardInvocation:(NSInvocation *)anInvocation
    {
    if ( [someOtherObject respondsToSelector: [anInvocation selector]] )
    [anInvocation invokeWithTarget: someOtherObject];
    else

    }


    Создание и уничтожение объектов


    В самом языке Objective-C нет специальных команд для создания и уничтожения объектов (подобных new и delete). Эта задача ложится на runtime-библиотеку и реализуется при помощи механизма посылки сообщений.
    Создание нового объекта разбивается на два шага — выделение памяти и инициализация объекта. Первый шаг реализуется методом класса alloc (реализованном в классе NSObject), который выделяет необходимое количество памяти (данный метод используется для выделения памяти не только для объектов класса NSObject, но и любого унаследованного от него класса). При этом выделяемая память обнуляется и в атрибут isa записывается указатель на class object соответствующего класса.

    Обратите внимание, что сообщение alloc посылается class object-у требуемого класса и это сообщение возвращает указатель на выделенную под объект память.

    Собственно сама инициализация объекта (т.е. установка значений его instance-переменных, выделение дополнительных ресурсов и т.п.) осуществляется другими методами, по традиции имена этих методов начинаются с init. Обычно такое сообщение посылается сразу же после сообщение alloc, по адресу, возвращенному этим сообщением.

    id anObject = [[Rectangle alloc] init];

    При создании нового класса обычно нет необходимости переопределять метод alloc, а вот необходимость переопределения метода init возникает достаточно часто (хотя во многих случаях можно положится на обнуление памяти alloc'ом).

    Обратите внимание, что метод(ы) init является обычным методом, ничем не выделяющимся среди остальных (в отличии от С++, где конструктор — это особый метод, у которого например нельзя взять адрес). Поэтому при создании нового класса и метода init вызов переопределенного метода init (при помощи [super init]) должен быть произведен явно в самом начале метода.

    Mac OS X (как и NextStep) для управления временем жизни объектов используют reference counting — каждый объект содержит внутри себя некоторый счетчик, при создании устанавливаемый в единицу.

    Посылка объекту сообщения retain увеличивает значение этого счетчика на единицу (так все контейнерные классы библиотеки Foundation при помещении в них объекта, посылают ему сообщение retain). Установившейся практикой является посылка объекту сообщения retain всеми, заинтересованными в нем сторонами (объектами), т.е. если вы запоминаете ссылку на объект, то следует послать ему сообщение retain.

    Когда объект перестает быть нужен, то ему просто посылается сообщение release. Данное сообщение уменьшает значение счетчика на единицу и, если это значение стало меньше единицы, уничтожает данный объект.

    Перед уничтожением объекта ему посылается сообщение dealloc, позволяющее объекту произвести свою деинициализацию. При этом это также является обычным сообщением и в нем Вы явно должны в конце вызвать унаследованную реализацию через [super dealloc].

    — (void) dealloc
    {
    ...
    [super dealloc];
    }


    Objective-C 2.0


    На WDC2006 Apple представила новую версию языка — 2.0. Среди нововведений были отмечены сборка мусора, быстрая энумерация, свойства в классах, 64-битная поддержка и многое другое. Следует отметить, что эти нововведения доступны только для Leopard.

    Сборка мусора


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

    Свойства


    Ранее для изменения и чтения instance variables необходимо было писать методы возврата и задания значения(т.н. getters and setters), теперь можно писать так:

    @interface Person: NSObject {
    }
    @property(readonly) NSString *name;
    @property(readonly) int age;
    -(id)initWithName:(NSString)name age:(int)age;
    end


    Получить имя можно так:
    NSString *name = aPerson.name;

    Быстрая энумерация


    Теперь добавлен аналог оператора foreach:
    for (Person *p in thePeople) NSLog(@"%@ is %i years old.", [p getName], [p getAge]);

    Для первой части хватит. При составлении статьи были использованы материалы сайтов developer.apple.com и steps3d.narod.ru(кстати единственный сайт, на котором есть информация про программирование в Mac OS X на русском).

    В следующей части расскажу про среду разработки XCode и редактор интерфейсов Interface Builder, а также покажу создание совсем простенького приложения.
    Поделиться публикацией
    Похожие публикации
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 91
    • +13
      не пинайте сильно, статью на хабре писал в первый раз, надеюсь хабралюдям будет интересно
      • 0
        Мне как человеку, мягко говоря, далёкому от программирования под OSX, было очень интересно почитать. Будет здорово, если вы продолжите писать обзорные (ну и более глубокие тоже) статьи про это!
        Небольшой минус - текст не очень хорошо вычитан, попадаются частенько опечатки и некоторые ляпы, но это мелочи :) Спасибо.
        • +2
          Буду стараться не влазить глубоко в дебри. Следующая часть будет полегче, просто про ObjC промолчать никак нельзя было
        • НЛО прилетело и опубликовало эту надпись здесь
          • +2
            вам на заметку: если нет макинтоша, но хочется использовать библиотеки NextSTEP, то есть проэкт gnuStep
            • НЛО прилетело и опубликовало эту надпись здесь
              • +2
                а мне сама концепция передачи сообщений понравилась :-)
                • НЛО прилетело и опубликовало эту надпись здесь
                  • 0
                    "Ангар 51"

                    1 апреля 1998 года один из аналитиков опубликовал парадоксальное сообщение. Как оказалось, технологии Apple имеют внеземное происхождение. Более того - в тщательно охраняемом ангаре, где-то посреди техасской пустыни, несчастные инопланетные узники продолжают трудиться над техническим прогрессом и будущим вычислительной техники за глоток серно-аммиачной смеси, подвергаясь унижениям и притеснениям.


                    зы - юмор (:
                • 0
                  1. А кроме gnustep есть что-то еще (под Windows)? Gnustep насколько я знаю реализует не весь объем классов представленных в Apple библиотеке, и код их использующий не совсем переносим между этими библиотеками.
                  2. Есть ли оригинальная Apple библиотека для Windows? Ведь itunes & safari как то под нее портировали. Я понимаю, конечно, Cocoa там не будет, но хотя б прикладные классы типа работы с сетью, файлами...
                  3. Как специалист, вы может быть разъясните момент: судя по всему при посылке сообщения объекту, поиск соответствующего метода производится сравнением строковых сигнатур имени сообщения и имени метода в объекте. Как тут дела с быстродействием?
                  • НЛО прилетело и опубликовало эту надпись здесь
                    • НЛО прилетело и опубликовало эту надпись здесь
                      • 0
                        судя по всему при посылке сообщения объекту, поиск соответствующего метода производится сравнением строковых сигнатур имени сообщения и имени метода в объекте. Как тут дела с быстродействием?
                        Сравниваются не сами строки, а хеши. Но всё равно вызов через рантайм конечно медленнее, чем обычный вызов функции через указатель.
                        • 0
                          1. вроде Некстовская библиотека была выпущена под винду и солярис, правда где-бы скачать я не нашел. Можете использовать gnuStep через Cygwin
                          2. Я думаю есть(правда не полная реализация), но с сами ей никто делится не собирается
                          3. ну по идее для ускорения поиска таблица по которой идет этот поиск кешируется.
                          При поиске соотв метода используюся селекторы - спец тип, с помощью которого можно однозначно идентифицировать метод.
                          С производительностью все нормально.
                          • 0
                            Кстати iTunes на Carbon'е(С) написан (Сафари таки Cocoa(ObjC) использует), по всей видимости в угоду производительности и низкоуровневым (относительно) функциям.
                      • +1
                        Запинаем, если не будет продолжения!! :)
                        Спасибо!
                      • +1
                        Очень интерестно! Продолжай в том же духе! Ожидаем с нетерпением новых частей.
                        • +1
                          Написано очень интересно! Интересным и не занудным языком :) Жду следующих статей! И начинаю осваивать Objective-C :)
                          • 0
                            Интересно посмотреть как писать код для другой операционки, такое ощущение, что попал в другой мир
                            • 0
                              Спасибо :) Писал одно время. Ща хочу начать опять))
                              • 0
                                не за что. Самому интересно - вот и пишу.
                                P.S.:карма у меня уже больше 5, а почему не могу в блог Apple перенести?
                                • 0
                                  а ты подключен к блогу Apple? в блог писать могут только те, кто на него подписан:)
                                  • 0
                                    я сильно извинияюсь, а как к нему присоединится?
                                    • 0
                                      Заходите в блог Apple, там слева от названия блога будет квадратная "кнопка" с зеленой розеткой. На нее нажмите.
                                      • 0
                                        спасибо, а то что-то торможу я сегодня, сейчас перенесу
                                  • 0
                                    Вероятно, Вам нужно сначала "присоединиться" к этому блогу.
                                • 0
                                  >Язык Objective-C поддерживает работу с метаинформацией
                                  Вы уверены, что это называется метаинформацией? Я бы назвал это рефлекцией (reflection).
                                  • +1
                                    именно метаинформация - информация о типах. reflection как раз и основывается на такое информации. может не быть reflection, но reflection без метаинформации не может быть
                                    • 0
                                      Видимо, мы с вами оба отчасти правы :)
                                      http://en.wikipedia.org/wiki/Metaprogramming
                                      "Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data [...]
                                      The ability of a programming language to be its own metalanguage is called reflection or reflexivity."
                                  • 0
                                    Вай, вай, вай! Как замечательно! Отличный обзор, так держать. Жду с нетерпением продолжения!
                                    • 0
                                      как ни странно, но сам Finder тоже написан на карбоне...

                                      эх, и почему apple так не любит java'у :(
                                      • +1
                                        и почему не любит?
                                        P.S.:на ЛОРе постоянно говорят то ява - торомз. Не верил, запустил явовское приложение(какой-то текстовый редактор), теперь верю
                                        • 0
                                          потому что java-cocoa deprecated, java5 сломана, а java6 до сих пор не зарелизена под леопард.

                                          обсуждения про тормоза java в этой теме - оффтопик. да и лично у меня не тормозит, если честно
                                        • НЛО прилетело и опубликовало эту надпись здесь
                                          • 0
                                            macos x 10.5 (втч server) пока, увы, к "хороша" не отновится :(
                                            • НЛО прилетело и опубликовало эту надпись здесь
                                              • 0
                                                не относится, да, в macosx 10.5 server там тоже что-то сломали - азуреус третий не работает.
                                        • 0
                                          спасибо, было очень интересно почитать.
                                          • 0
                                            ничего, это только начало. Дальше будет интересней
                                            • 0
                                              а можно будет поподробнее про ruby-cocoa приложения? (:
                                              • 0
                                                ну если читатель захочет то куда я денусь? правда придется выучить руби и питон. Так что может подскажете хорошие мануалы на русском по этим языкам?
                                                • 0
                                                  хм. для руби имхо единственная и отличная книга - rubybook - the "Programming Ruby" book (:
                                                  • 0
                                                    для новичков — может быть. а вообще признанная библия руби это The Ruby Way.
                                                  • 0
                                                    Dive into Python Как для новичка неплохая книга, имхо.
                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                                    • 0
                                                      не думаю. если он официально поддерживается apple и специально создана была ruby-cocoa, то почему бы и не рассказать (:
                                                      • НЛО прилетело и опубликовало эту надпись здесь
                                              • 0
                                                отличная статья!
                                                пока читал, вспомнил как програмил под OS/2 когда-то,
                                                аж прослезился.
                                                спасибо еще раз!
                                                • –3
                                                  Замечательная статья!

                                                  Мысленно поставил "плюс".
                                                  • +1
                                                    история названия id Software:
                                                    Originally however, the company name has deeper roots than simple psychological reference. When working at Softdisk, the team that later founded id Software took the name "Ideas from the Deep" (a company created by John Romero and Lane Roathe in 1989), attributing themselves as "IFD guys". Since the term "id" can be seen as a shortening of IFD to "ID", some argue that it can still be pronounced "eye-dee". The I was later made lowercase in the release of the second Commander Keen series, eventually followed by the D. Since Wolfenstein 3D used the "id" pronunciation together with the mixed-case "iD", many argue that the capitalization is purely a stylistic choice.
                                                    • 0
                                                      Спасибо за статью, очень интересно.
                                                      • НЛО прилетело и опубликовало эту надпись здесь
                                                        • НЛО прилетело и опубликовало эту надпись здесь
                                                          • 0
                                                            а я вот наткнулся на более интересный ресурс (имхо, конечно:) - http://www.coding.sellme.ru/
                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                              • 0
                                                                автор указал steps3d.narod.ru
                                                                там текст который в вики появился раньше, по крайней мере в обсуждениях на вики есть ссылка на него.
                                                          • +1
                                                            Меня всегда мучал вопрос о том на чем же под макосью можно кодить. Спасибо за статью, будем учиться)
                                                            • 0
                                                              Любителей кроссплатформенных фреймворков и Delphi-стого синтаксиса также может заинтересовать крайний билд Lazarus'а с поддержкой Carbon (да, надо бы начинать перетаскивать сиё чудо на Cocoa) в Lazarus Component Library.
                                                              • 0
                                                                Аффтару 5 баллов! Пишите еще подобного рода статьи!
                                                                • 0
                                                                  ого! спасибо огромное! у меня начался второй семестр и программирование на си. до этого — серверными языками интересовался. и как раз думал, что начав изучать си в универе, начну изучать и разработку под мак. пока только консольные приложения — лабы — на си.

                                                                  и тут еще раз спасибо за objective-c, xcode следующей статьи и вообще, за эту тему!
                                                                  • 0
                                                                    да не за что. В XCode сможете писать лабы на Си.
                                                                    • 0
                                                                      уже пишу :-)
                                                                      первую сегодня сдаю
                                                                      • 0
                                                                        Под мак есть компилятор Delphi? У меня скоро лабы на нем пойдут.
                                                                        • +3
                                                                          Денис, ты головой хоть думай иногда. Какой нафиг Делфи? Борлонд - RIP. Делфи нам рассказывают исключительно потому, что преподы ничего другого не знают. Делфи нет и слава богу.
                                                                          VMWare Fusion + WinXP тебе помогут

                                                                          P.S.:Да, я ненавижу Делфи, причин много, кому интересно - напишу топик
                                                                          • 0
                                                                            Интересно. Прошу направить луч позора в сторону детища B/CG, дабы слиться в едином экстазе с другими полководцами холиварных воин, троллями & etc. в последующей дискуссии. Ждем-с.
                                                                            • 0
                                                                              да лень как-то сейчас. На делфи давно заставляли писать, уже желания особого нету. Правда через месяц новый учебный год, если какой-нибудь препод будет заставлять писать на делфи, то статья будет
                                                                              • 0
                                                                                Если будет желание взяться и, главное, появится свободное время - постучитесь. Возможно совместно сможем оформить сей никому не нужный опус (ну реально только холивар разводить) в относительно интересной форме (авось пара неокрепших неофитов сможет вычленить для себя что-нибудь интересное).

                                                                                Язык/среда не важны. Под каждую задачу есть свои наиудобнейшие инструменты.
                                                                                • 0
                                                                                  >Язык/среда не важны. Под каждую задачу есть свои наиудобнейшие инструменты.

                                                                                  не спорю, вот только еще не видел задач, в которых Делфи был бы наиудобнейшим инструментом
                                                                                  • 0
                                                                                    До появления .NET Framework (местами и после), многие задачи, требующие высокой абстракции и не имеющих низкоуровневых привязок, решались значительно быстрее с использование "фреймворка" Borland VCL + Third-party VCL.

                                                                                    С точки зрения rapid development'a VCL был наипростейшим из наидоступнейших. Повтрюсь, что местами так и остается.
                                                                                    • 0
                                                                                      Уточню, что имеется в виду исключительно разработка под Win32 и GUI приложения.

                                                                                      Отлично понимаю, как Delphi разрушает мозг молодым адептам. Тоже самое, заметьте, делает .NET. Многие, к сожалению, не способны Учиться. Проблема Delphi не в языке / среде / framework'e.
                                                                                      • 0
                                                                                        Многие, к сожалению, не способны Учиться
                                                                                        самое страшное, когда один из этих многих - твой препод по программированию :-(

                                                                                        Проблема Delphi не в языке / среде / framework'e.

                                                                                        согласен. ИМХО проблема в том, что порог вхождения у Delphi ниже чем у аналогов => он привлек к себе толпу codemonkeys, которые его и убили
                                                                                        • 0
                                                                                          Именно это я имел в виду, рад что сошлись во мнении. Аналогично дела обстоят с .NET Framework, только окромя этого MS делает все, чтобы "программирование вошло в каждый дом".

                                                                                          Я за последние 2 года столько швали увидел среди .NET "разработчиков". Благо есть адекваты, на хабре их много.
                                                                      • НЛО прилетело и опубликовало эту надпись здесь
                                                                        • 0
                                                                          Ну, как же. Серверные языки программирования. PHP, к примеру
                                                                          • НЛО прилетело и опубликовало эту надпись здесь
                                                                            • 0
                                                                              Ну, не сможете, значит не сможете. Не утрируйте.
                                                                      • +1
                                                                        Очень интересно. А вообще как быть если кто то хочет начать программы с 0 знаниями о мире програмирования ? (и скудными знаниями ENG языка)
                                                                        • 0
                                                                          Если есть желание - поможем. Но говорю сразу - будет трудно.
                                                                          • 0
                                                                            Читать книжки, учить ENG. А как вы хотели? За 2 секнуды стать мастером кунг-фу, как Нео в Матрице?
                                                                          • +1
                                                                            Очень много копипасты со steps3d.narod.ru, зачем тогда интернет придумывали? Очень мало оригинального контента в статье, чужие материалы не просто «использованы», а скопипащены вплоть до запятой.

                                                                            Даже в копипасте всегда есть место творчеству, которое улучшает контент и делает его на шаг лучше; это называется реферат.
                                                                            • +1
                                                                              знаю. Там очень хорошо рассказано про ObjC, да еще и на русском, так зачем писать велосипед? Источник я указал. Следующие части будут чисто моими
                                                                            • 0
                                                                              Carbon - это все, что портировано на макось с других платформ (С и С++ потому, что). По этому то, что он не будет развиваться и не будет доступен для 64бит очень плозхо.
                                                                              • 0
                                                                                не, карбон создан для того, чтобы большие проекты и Classic перенести в OS X, например MS Office или Photoshop. Но от прогресса никуда не денешься и придется Адобу и Майкрософту потратится на програмеров хороших, а не на пиарщиков, чтобы переписать продукты, а то отсутствие флеш плеера под 64бит немного заставляет задуматься что такого сложного в реализации флеша.
                                                                                • 0
                                                                                  Да черт с ним с Адобом, я в них не сомневаюсь, а что делать с GIPM'ом и прочей гнутой гуйней? Вопрос ее нужности я обсуждать не хочу (holy war), вопрос в отрезании портируемости.
                                                                                  • +1
                                                                                    Э.. стоп. GIMP же написан на GTK(порт которого есть на мак), под Mac OS X запускается только через X11, так что при чем тут карбон я немного не понимаю
                                                                                    • 0
                                                                                      Верно! Я наврал, получается. Спасибо, -1 повод для расстройства.
                                                                              • 0
                                                                                Спасибо! Давно уже хотел научиться писать хотя бы простенькие программы для Mac OS X!
                                                                                • 0
                                                                                  не, тут в основном описание языка ObjC(которое я частично скопипастил ибо хорошо написано). Простенькие програмки будут в след. части
                                                                                • 0
                                                                                  если что, то вот вторая часть => http://habrahabr.ru/blog/apple/36859.htm…
                                                                                  • 0
                                                                                    отличная статья для новичков, спасибо!
                                                                                    много вопросов, но это уже надо читать документацию по Obj-C. Эта статья поможет быстрее понять чтение английской доки.
                                                                                    • 0
                                                                                      > Обратите внимание, что в Objective-C все методы являются виртуальными, т.е. могут быть переопределены.

                                                                                      Нет, это значит, что используется динамическое связывание.

                                                                                      В примере ниже метод virt_f() виртуальная и при её вызове используется динамическое связывание (используется таблица виртуальных методов для определения адреса настоящего метода вне зависимости от того, каким типом был объявлен объект). Хоть и тип переменной f — foo, virt_f() вызывается из bar, так как это настоящий тип переменной.

                                                                                      Метод normal_f() был просто переопределён, но это не важно. Главное, что метод не виртуальный и компиялтор использует статическое связывание. Хоть метод normal_f() и был переопределен, но раз тип переменной f — foo, то и normal_f() вызывается из foo.

                                                                                      #include <iostream>

                                                                                      using std::cout;
                                                                                      using std::endl;

                                                                                      class foo
                                                                                      {
                                                                                      public:
                                                                                      virtual void virt_f()
                                                                                      {
                                                                                      cout << "foo::virt_f()" << endl;
                                                                                      }

                                                                                      void normal_f()
                                                                                      {
                                                                                      cout << "foo::normal_f()" << endl;
                                                                                      }
                                                                                      };

                                                                                      class bar: public foo
                                                                                      {
                                                                                      public:
                                                                                      virtual void virt_f()
                                                                                      {
                                                                                      cout << "bar::virt_f()" << endl;
                                                                                      }

                                                                                      void normal_f()
                                                                                      {
                                                                                      cout << "bar::normal_f()" << endl;
                                                                                      }
                                                                                      };

                                                                                      int main()
                                                                                      {
                                                                                      foo *f = new bar();
                                                                                      f->virt_f();
                                                                                      f->normal_f();
                                                                                      }

                                                                                      user@host$ g++ a.cc
                                                                                      user@host$ ./a.out
                                                                                      bar::virt_f()
                                                                                      foo::normal_f()

                                                                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                                      Самое читаемое