Пользователь
0,0
рейтинг
2 декабря 2010 в 08:58

Разработка → Objective-C для C# разработчиков tutorial

«Если единственный язык, который вы знаете — это Java или C#, я не думаю, что вы профессиональный программист — вы как молодой плотник, который пока работал только с одним видом дерева.»
Дядя Боб


Несколько месяцев назад я начал разрабатывать приложения для iPhone. Переключение с платформы .NET и C# на Cocoa и Objective-C проходило не без приключений, но было достаточно интересным и познавательным. Скоро мне предстоит помогать осваивать новую платформу и другим разработчикам нашей компании. Поэтому решил написать серию вводных заметок, которые, надеюсь, сделают этот переход более плавным.


В этой заметке будет приведен небольшой набор фактов об Objective-C с точки зрения C#-разработчика.

  • Objective-C — это объектно ориентированный язык, «честное» расширение языка С (программа, написанная на C, является программой на Objective-C, что не всегда верно, например, для С++).
    Достаточно подробно о языке было написано в недавней статье Objective-C с нуля.
  • для описания объекта создается два файла — заголовочный с расширением .h и файл реализации с расширением .m
  • классы Objective-C являются объектами, грубо говоря, класс Objective-C можно представить как реализацию паттерна фабричный метод с набором статических методов.
  • множественное наследование, так же как и в C#, не поддерживается.
  • NSObject — это «аналог» базового класса System.Object в .NET.
  • когда мы пишем interface в Objective-C, подоразумеваем class C#.
  • а то, что в C# называем interface, в Objective-C зовем protocol.
  • в Objective-C есть два типа методов — методы класса (их объявление начинаем со знака "+") и методы экземпляра (объявление начинается с "-"). Методы класса, как понимаете, — это те же статические методы С#.
  • если мы хотим вызвать метод объекта, мы посылаем ему сообщение об этом (Objective-C — message-oriented язык, в отличии от function-oriented С#).
  • в Objective-C все методы public (точнее говоря, в нем вообще нет разделения методов по уровням доступа).
  • в Objective-C все методы virtual (то есть любой метод может быть переопределен в классе-наследнике).
  • сборщика мусора в Objective-C, к сожалению, нет (при программировании для iPhone). Вместо него используется механизм подсчета ссылок.
  • чтобы получить привычные нам property, в заголовочном файле используем для объявления свойства ключевое слово @property, а в файле реализации с помощью @syntesize генерируем геттер и сеттер.
  • #import — это using
  • self — это указатель this
  • super — это base
  • id — это как object

Посылка сообщений


Вообще, подход посылки сообщений в Objective-C и, как следствие, способ именования методов — это целая философия. На хабре уже был пост о том, что при виде методов Objective-C у людей выпадают глаза . Эта статья рассчитана на людей, пытающихся запихнуть их обратно. Проще всего это сделать, увидев аналогию с чем-то знакомым.
Давайте посмотрим как выглядит вызов метода в Objective-C. В каждом примере будет приведен реальный аналог на C#.
Метод без параметров:
C#:
someString.ToLower();
Objective-C:
[someString ToLower];

С одним параметром:
someString.Equals(anotherString);
[someString isEqualToString:anotherString];

С несколькими параметрами:
someString.EndsWith(anotherString, true, someCulture);
[someString isEndedWithString:anotherString withIgnoreCase:YES andCultureInfo:someCulture];

Вложенные сообщения:
someString.Substring(1).EndsWith(anotherString.Trim()true, CultureInfo.CurrentCulture);
[[someString getSubstringStartedAtIndex:1] isEndedWith:[anotherString Trim] withIgnoreCase:YES andCultureInfo:[CultureInfo getCurrentCulture]];


Как было написано выше, в Objective-C два вида методов — методы экземпляра и методы класса. Посмотрим как они объявляются в C# и Objective-C.
Метод экземпляра:
public int sum(int firstNumber, int secondNumber);
-(int)sumOfFirstNumber:(int)firstNumber andSecondNumber:(int)secondNumber;

Метод класса (или статический метод в C#):
static int Length(string str);
+(int)Length:(NSString*)str;


Немного о конструкторах и деструкторах


Как и в C# мы можем создать объект, используя ключевое слово new.
[someObject new];

Этот метод аналогичен следующей операции
[[someObject alloc] init];

alloc выделяет память под объект, а init инициализирует этот участок памяти некоторыми дефолтными параметрам. В C# при вызове конструктора эти операции логически не разделяются.
Рекомендуется использовать второй подход, так как он более точно показывает механизм создания объекта (а мы ведь должны понимать, что делаем, верно?) и поддерживает возможность использования различных вариантов инициализации (можем переопределять конструктор).
[[someObject alloc] initWithTitle:@"SomeTitle"];

Вот пример объявления нескольких конструкторов класса NSString:
- (id)init;
Возвращает инициализированный объект NSString, который не содержит символов.
- (id)initWithString:(NSString *)aString;
Возвращает инициализированный объект NSString, копируя символы из другого объекта NSString.
- (id)initWithCharacters:(const unichar *)characters length:(NSUInteger)length;
Возвращае инициализированный объект NSString, содержащий указанное число символов из данного массива символов.

Если init — конструктор в Objective-C (или связка alloc+init), то dealloc — деструктор (освобождение памяти). Как и в C# он вызывается автоматически.

И немного о счетчике ссылок


При переходе с C#, управление памятью при разработке на Objective-C — это один из самых важных вопросов. Мы (.NET разработчики) в этом смысле избалованы — привыкли, что в большинстве случаев за нас все сделает garbage collector. Тут такой подход не пройдет, без внимательной работы с памятью приложения, будете регулярно получать «странные» ошибки.
Механизм счетчика ссылок реализует базовый для всех объектов NSObject. Идея следующая: каждый объект содержит счетчик ссылок, если количество ссылок становится равным нулю, вызывается деструктор (dealloc). Никогда не вызывайте dealloc самостоятельно!
Значение счетчика увеличивается на единицу при выделении памяти под объект (вызове метода alloc/new), при создании копии объекта (сообщение copy), при посылке объекту сообщения retain. Чтобы уменьшить значение счетчика на единицу, нужно послать объекту сообщение release.
Схема работы с объектом обычно такая: создали (счетчик ссылок увеличился на единицу), выполнили необходимые действия(все заинтересованные объекты посылают ему сообщения retain, а затем release), послали сообщение release (уменьшили счетчик на единицу), вызывается деструктор.
С сообщением release нужно быть аккуратным и избегать лишних вызовов, так как повторный вызов деструктора объекта уронит программу.
Также есть возможность избавиться от необходимости помнить о том, что нужно послать объекту сообщение release (иногда это обусловлено тем, что объект возвращается методом и мы не знаем его дальнейшую судьбу). Это можно сделать с помощью сообщения autoRelease и объекта AutoreleasePool.
[[[someObject alloc] init] autorelease];

Объект записывается в AutoreleasePool. То есть сообщение release будет послано объекту «когда-нибудь потом», а до тех пор объект будет находиться в памяти. «Когда-нибудь потом» наступает, когда объекту AutoreleasePool посылается сообщение release или drain.

В продолжение темы советую посмотреть недавний доклад Shivani Khanna «Objective C for C# Developers».
Дополнение/исправления приветствуются.
Спасибо, что прочитали статью!
Dmitry Khryukin @BurundukXP
карма
90,2
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (106)

  • 0
    > в Objective-C все методы public (точнее говоря, в нем вообще нет разделения методов по уровням доступа).

    А как же @private, @protected, @public?
    • +2
      Это касается ТОЛЬКО полей класса, но не методов.

      Обычно, чтобы определить private-методы делают категорию, которую определяют в .m-файле, а не .h.

      Например: macdevelopertips.com/objective-c/private-methods.html
      • +4
        Дополню. Спрятать методы можно только на уровне интерфейса. Практически же, можно послать любое сообщение объекту с помощью performSelector: и если у него есть соответствующий метод (можно проверить с помощью respondsToSelector:), то он будет выполнен. Больше того: с помощью runtime можно узнать, какие есть свойства и методы у объекта и обращаться к ним.
        • +1
          … а также подменять реализации методов и делать многие другие фокусы, свойственные в основном скриптовым языкам
    • +3
      Это относится только к переменным экземпляра класса.
      Метод можно только попытаться спрятать, убрав из .h файла.
      Далее его можно вообще не декларировать, а можно задекларировать в категории к классу в .m файле.
  • 0
    Спасиоб за статью!
    Вопрос по использованию памяти: если мы делаем release какому-то объекту, содержащему ссылки на другие объекты, будет ли автоматически сделан release для этих ссылок внутри него?
    • +3
      Нет. Вы должны это сами сделать в методе -(void)dealloc класса.
      да и не забывайте про [super dealloc]
      т.е. должно выглядеть так

      -(void) dealloc{
      //release для объектов, на которые ссылаемся
      [super dealloc];
      }
      • 0
        Еще нужно отметить, что dealloc вызывается не сразу, когда счетчик ссылок становится равен нулю, а, в общем случае, по завершении текущего RunLoopCycle.

        Так же стоит упомянуть, что в 99,9% случаев вызов dealloc руками не нужен, кроме [super dealloc]. 0.1% оставил на случай если я чего-то не знаю, но пример, когда нужно вызывать его самому придумать не могу.
        • +2
          Есть подозрение, что Вы путаете освобождение памяти для autorelese объектов.
          Можете поделиться ссылкой, где бы было написано о вызове dealloc по завершении текущего RunLoopCycle, интересно же.
          • +1
            Да, сейчас посмотрел — и правда перепутал. dealloc, по всей видимости вызывается как только retainCount == 0. Виноват.
      • НЛО прилетело и опубликовало эту надпись здесь
  • +2
    >программа, написанная на C, является программой на Objective-C, что не всегда верно, например, для С++).

    Какой же это объектно ориентированный язык если программа написанная на С является программой на Objective C?

    • 0
      Оно скомпилится просто. Чтобы написать программу для iPhone в любом случае понадобится cocoa-touch «прослойка».
  • 0
    Такой вопрос: при первом знакомстве с Objective C, как .NET разработчик, Вы скорее всего смотрели в сторону MonoTouch (лично со мной было бы, именно так). Расскажите, почему всё-таки решили писать на чистом Objective C?
    • 0
      Все эти молодые фреймворки очень сырые.
      Вам придется или вылавливать в них баги, или бороться с ограничениями, которые они накладывают.

      И для небольших приложений (под iPhone) это дает небольшой выигрыш.
      Вот ради XNATouch можно постараться — это хороший мощный фреймворк, а MonoTouch — просто обертка. Радикально новой функциональности он не приносит.
    • +2
      нет, не смотрел на MonoTouch. во-первых, я всегда считал и продолжаю считать, что всегда лучше пользоваться нативными средствами разработками. во-вторых, было как раз время запрета Apple на разработку приложений ненативными средствами.
      на MonoTouch смотрю сейчас, но вовсе не из-за того, что я .Net разработчик:) меня привлекает идея писать приложения сразу под несколько устройств (или очень быстро переносить написанный код с одной платформы на другую) — iPhone, Windows Phone 7 (в будущем, думаю, и Android).
  • –5
    Купила бы Apple лицензию на C# у Microsoft и всего делов.
    • +1
      зачем?
      • 0
        очевидно чтобы автору предыдущего поста было хорошо, больше незачем

        или как в анекдоте
        — ща в ухо дам!
        — зачем?
        — за шкафом!
      • –1
        Видимо, автор комментария очень хочет остаться плотником «который пока работал только с одним видом дерева» (с) :)
        • НЛО прилетело и опубликовало эту надпись здесь
          • 0
            Он такой же объектный язык как Java и C#. Нет, правда. Квадратные скобки пугают до поры до времени. Потом привыкаешь и пишешь без проблем вообще.
            • НЛО прилетело и опубликовало эту надпись здесь
              • 0
                Приведи пример.
                • НЛО прилетело и опубликовало эту надпись здесь
                  • +3
                    третий пункт можете сразу вычеркнуть
                    начиная с версии iOS 4.0 добавлены т.н. блоки, которые как раз представляют из себя лямбды, плюс все прелести замыкания и т.п.
                    более детально здесь и здесь
                    • НЛО прилетело и опубликовало эту надпись здесь
                    • +2
                      Лямбды в C# — это еще и Expression Trees. Совершенно убийственный инструмент в умелых руках.
                  • +1
                    1й пункт не очень понимаю, честно говоря.

                    Я на objc могу написать примерно следующее:
                    for ( NSObject *x in something ) {
                        [x performSelector:@selector(bla-bla-bla:) withObject:mu-ha-ha];
                    }


                    Как уже упомянули выше, мы объекту можем послать любое сообщение и, если у него прописан обработчик этого сообщения, объект ответит.

                    Может я не так понял — поясните?
                    • НЛО прилетело и опубликовало эту надпись здесь
      • НЛО прилетело и опубликовало эту надпись здесь
        • 0
          Поддерживаю.
        • +2
          Первое — субъективно. Второе — объективно, но не показатель удобства. Brainfuck тоже моложе Objective-c.
        • +1
          насчет удобства — субъективная оценка
          да и вообще, «удобство» языка это что?
          более уместно тут сравнивать IDE для разработки на C# и Objective-C, но это уже совершенно другая тема
          • НЛО прилетело и опубликовало эту надпись здесь
            • +3
              не самый удачный пример
              в этом случае вообще нет необходимости использовать специфику objective-c, и можно обойтись чем-то вроде
              // C
              int sum = 0, seq[] = {1, 2, 3, 4, 5};
              for (int i = 0; i < sizeof(seq) / sizeof(seq[0]); i++) sum += seq[i] * seq[i];


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

              человеку, который годами писал на С, тоже достаточно долго придется втолковывать почему такой непривычный и не понятный для него синтаксис F#, на самом деле лаконичнее и понятнее
              • НЛО прилетело и опубликовало эту надпись здесь
              • 0
                Как раз-таки этот пример удачный. То, что вы написали, во-первых, это 4 строки вместо двух, во-вторых, тут сначала приходится думать о том, каким образом пройтись по массиву и куда сложить результаты, а уж потом, как мне работать с этими данными из массива. С этой точки зрения линкью просто прекрасен. То, что по другому умещалось бы, как минимум в одной строке, с помощью Linq занимает всего один вызов нужного экстеншен метода в общей цепочке.
                • 0
                  А почему вы понятность меряете строчками? Те 4 строки можно превратить хоть в одну, наворотив макросов.
                  • 0
                    Я не мерил понятность строчками? Понятность (в данном случае легкость написания) я мерил абстрактностью над итерацией. Программист думает не над тем, каким образом ему данные «обойти», что, по сути, является чисто рутинной операцией, а о том, что с этими данными ему нужно сделать при «обхождении».

                    Количество строк — это побочное свойство, отчасти оно вытекает из того же, что я написал и выше. Каждая подготовительная строка символизирует очередную рутинную операцию, которая необходима для того, что бы подготовить данные для обработки. И лишь в самом конце кода, который занимает 20-30%, у вас написана сама суть программы. Вот что я называю понятностью, хотя лучше было бы выразить это лаконичностью.
            • +1
              На ObjC этот код будет выглядеть намного проще, кстати — или что вы хотели им сказать?

              IMHO, нет уже такого понятия, как «удобство языка», по одной простой причине: уже давно никто ничего не пишет на герметизированном сферическом языке в вакууме.

              Пишут с использованием библиотек, фреймворков, паттернов, навязываемых (в хорошем смысле) этими самыми фреймворками. Нет никакой разницы, как написать: button = [[UIButton buttonWithTitle:@«hello»] или button = CButton.buttonWithTitle(«hello»), по большому счету.

              Конечно, я не учитываю пограничные случаи типа brainfuck vs C#.

              • НЛО прилетело и опубликовало эту надпись здесь
                • +2
                  Я понял, у вас простота = «все написать в одну строчку».
                  • НЛО прилетело и опубликовало эту надпись здесь
                    • +3
                      NSArray* array = // ... ;
                      __block sum = 0;
                      [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
                              m = [obj intValue];
                              sum += m*m;
                      }];
                      

                      • НЛО прилетело и опубликовало эту надпись здесь
                        • +1
                          А чем вот это: «var sqrSum = ( from x in seq select x*x ).Aggregate(0, (acc, x) => acc + x);» проще?

                          Ваш пример больше похож на regexp — да, лаконично, да — в одну строчечку, да — можно выпендриться перед собеседуемым, но если разбирать модуль в 10000 строк, написанный таким образом — да вы первый застрелитесь.
                          • НЛО прилетело и опубликовало эту надпись здесь
                            • +1
                              Модифицируйте свой пример так, чтобы квадраты четных чисел суммировались отдельно от нечетных и чтобы если одна из сумм превышает 99, мы выпадали из функции (return -1).
                              • НЛО прилетело и опубликовало эту надпись здесь
                                • НЛО прилетело и опубликовало эту надпись здесь
                                • 0
                                  Что и требовалось доказать: как только мы отошли от сферического цикла в вакууме, пришлось отказаться от такого замечательного LINQ.
                                  • НЛО прилетело и опубликовало эту надпись здесь
                                    • 0
                                      > Ваша задача, это и есть сферический конь в вакууме, не имеющий ни малейшего отношения к практике.

                                      Самая обычная задача — пробежаться по циклу и что-нибудь сделать с элементами (возможно, не со всеми). Как только логика чуть-чуть изменилась — все, LINQ поднял лапки, начались намеки на костыли и проч.

                                      Это очень похоже на binding, реализацию MVC на «большом» Cocoa — все красиво выглядит в примерах, какие-то вещи можно писать вообще не написав ни строчки С-шного кода, но когда пытаешься вытащить это в реальный мир, вся красота разваливается из-за ограничений фреймворка.

                                      Т.е. получается так, что простые вещи делать еще проще, а сложные — еще сложнее.
                                      • НЛО прилетело и опубликовало эту надпись здесь
                                        • 0
                                          > Просто эта задача проще и более интуитивно решается обычной итерацией.

                                          Покажите сложную задачу, которая решается проще с использованием LINQ.
                                          • НЛО прилетело и опубликовало эту надпись здесь
                                            • 0
                                              Покажите хоть один такой случай. Не в виде общих пространных рассуждений, а куском кода.
                                              • НЛО прилетело и опубликовало эту надпись здесь
                          • 0
                            Спустя два года… :)

                            На самом деле, описанный выше через жопу (простите) пример правильно закодить следующим элементарным LINQ запросом:

                            var sqrSum = seq.Sum(x => x*x);

                            Проще? :)
            • +1
              Да и у вас не самый читабельный код с LINQ-вставкой;

              var sqrSum = seq.Aggregate(0, (acc, x) => acc + x*x );


              так не проще?
              • НЛО прилетело и опубликовало эту надпись здесь
              • 0
                (from x in seq select x*x).Sum();
                или
                seq.Select(x=>x*x).Sum();
                • НЛО прилетело и опубликовало эту надпись здесь
              • 0
                var sqrSum = seq.Sum(x => x*x);
        • +1
          Я пишу и на Java и на C# и на Objective C.
          И как ни странно писать на Objective C мне приятнее. Хотя согласен что она сильно отличается от всего остального и тем более намного многословнее чем Java и C#.
          Она как бы более понятна мне, что ли?!
    • +1
      и дальше чего?
  • 0
    И как ощущение от языка? :)
    • 0
      нравится. сначала, конечно, было очень непривычно. но потом втянулся. определенный шарм у Objective-C есть.
  • +3
    синтаксис жесткий, конечно… немудрено, что глаза выпадают
    • 0
      Цель Objective-C — быть максимально схожим с английским языком. Т.е:

      -(id)initWithFirstDigit:(NSNumber*)firstDigit andSecondDigit:(NSNumber*)secondDigit;

      читается как английское предложение «Init with first digit (firstDigit) and second digit (second digit).»
      • +2
        читалось бы, если бы не вырвиглазные скобки, звездочки и двоеточия, тире и т.д.
        • +1
          приходится цитировать свой же коммент из похожего спора в другом топике
          там была такая фраза
          Когда здоровый программист впервые видит вызовы методов в Objective C — у него выпадают глаза.

          многое зависит от того, как писать
          даже на C#, F# можно писать так, что поймет только автор и никто больше, а вот как можно перефразировать цитату сверху на ObjC:
          if ([здоровыйПрограммист видитВпервые:objectiveC.вызовМетода]) {
              [здоровыйПрограммист.глаза выпадают];
          }

          так что повторюсь, язык очень и очень читабельный, и даже воспитывает в разработчике определенную культуру кода
          а еще понятнее он становится, если перестать судить о нем с колокольни, например, С#, и взамен посвятить его изучению примерно пол часа в день, в течении 2-х недель
          всю неприязнь и все неудобства как рукой снимет
      • –2
        Никак не могу понять, что здесь написано. firstDigit & andSecondDigit — это имена передаваемых переменных?
        • 0
          в данном случае это объявление метода, название метода разрывается аргументами, которые должны идти после двоеточия.
          Вызов этого метода (точнее отправка сообщения) будет выглядеть как то так:
          [someObj initWithFirstDigit:firstArgument andSecondDigit:secondArgument]
        • 0
          Селектором метода (сам метод грубо говоря) является
          initWithFirstDigit:andSecondDigit:

          Аргументами являются firstDigit и secondDigit
          • 0
            Просто я не могу понять, слово and в начале переменной — это часть стиля программирования (т.е. пишу и называю переменные, как будто пишу предложение) или это часть языка, где приставка and разделяет переменные?
            Просто в первом случае схожесть с английским языком — это заслуга программиста, а не языка.
            • 0
              Слово and, конечно, не является частью синтаксиса языка. Хотите пишите, не хотите — не надо.
              Схожесть с английским в Objective-C заключается в формулировке названий методов, не «название(аргументы, через, запятую)» как в C++, whatever, а «Описание: аргумент описание2: аргумент» и т.д.
              • –2
                Ну, название метода, это и есть его краткое описание (получаю то-то, делаю то-то), тоже самое и с аргументами. Так что, по моему, это не оправдывает этот, весьма странный, синтаксис. К тому же, все эти скобочки, пробелы вместо точек, куча еще символов для бог знает чего, отнюдь не похоже на английский язык.
            • 0
              это часть стиля программирования.
      • 0
        В этом топике несколько раз встречается утверждение, что цель — максимальная схожесть с английским. Это глупость. Цель — скрещивание си со смолтолком. Получилось, надо сказать, довольно эклектично. Что же до «максимальной похожести на английский» — не вижу ничего хорошего. Вот «hello, world» на языке, который ДЕЙСТВИТЕЛЬНО проектировался с целью быть максимально похожим на английский:
        The Infamous Hello World Program.
        
        Romeo, a young man with a remarkable patience.
        Juliet, a likewise young woman of remarkable grace.
        Ophelia, a remarkable woman much in dispute with Hamlet.
        Hamlet, the flatterer of Andersen Insulting A/S.
        
        
                            Act I: Hamlet's insults and flattery.
        
                            Scene I: The insulting of Romeo.
        
        [Enter Hamlet and Romeo]
        
        Hamlet:
         You lying stupid fatherless big smelly half-witted coward!
         You are as stupid as the difference between a handsome rich brave
         hero and thyself! Speak your mind!
        
         You are as brave as the sum of your fat little stuffed misused dusty
         old rotten codpiece and a beautiful fair warm peaceful sunny summer's
         day. You are as healthy as the difference between the sum of the
         sweetest reddest rose and my father and yourself! Speak your mind!
        
         You are as cowardly as the sum of yourself and the difference
         between a big mighty proud kingdom and a horse. Speak your mind.
        
         Speak your mind!
        
        [Exit Romeo]
        
                            Scene II: The praising of Juliet.
        
        [Enter Juliet]
        
        Hamlet:
         Thou art as sweet as the sum of the sum of Romeo and his horse and his
         black cat! Speak thy mind!
        
        [Exit Juliet]
        
                            Scene III: The praising of Ophelia.
        
        [Enter Ophelia]
        
        Hamlet:
         Thou art as lovely as the product of a large rural town and my amazing
         bottomless embroidered purse. Speak thy mind!
        
         Thou art as loving as the product of the bluest clearest sweetest sky
         and the sum of a squirrel and a white horse. Thou art as beautiful as
         the difference between Juliet and thyself. Speak thy mind!
        
        [Exeunt Ophelia and Hamlet]
        
        
                            Act II: Behind Hamlet's back.
        
                            Scene I: Romeo and Juliet's conversation.
        
        [Enter Romeo and Juliet]
        
        Romeo:
         Speak your mind. You are as worried as the sum of yourself and the
         difference between my small smooth hamster and my nose. Speak your
         mind!
        
        Juliet:
         Speak YOUR mind! You are as bad as Hamlet! You are as small as the
         difference between the square of the difference between my little pony
         and your big hairy hound and the cube of your sorry little
         codpiece. Speak your mind!
        
        [Exit Romeo]
        
                            Scene II: Juliet and Ophelia's conversation.
        
        [Enter Ophelia]
        
        Juliet:
         Thou art as good as the quotient between Romeo and the sum of a small
         furry animal and a leech. Speak your mind!
        
        Ophelia:
         Thou art as disgusting as the quotient between Romeo and twice the
         difference between a mistletoe and an oozing infected blister! Speak
         your mind!
        
        [Exeunt]
    • +2
      Но при этом очень логичный. Выражения напоминают выражения на естественном языке, что повышает читаемость кода.

      И опять же, Обджектив-Си далеко в этом деле до Хаскелля, например :) Даже со скидкой на другую парадигму.
      • НЛО прилетело и опубликовало эту надпись здесь
        • 0
          Это если изрядно его теребить.
          А если вот так, внезапно, посмотреть нетренированным взглядом — богатство синтаксиса может свести с ума :)
          • НЛО прилетело и опубликовало эту надпись здесь
            • 0
              Согласен. Но шок-эффект для бывших С-программистов — безусловно выше.
  • –2
    Собственно, в Objective-C тоже допускается использование конструкции
    [SomeObject new]

    Это эквивалентно конструкции
    [[SomeObject alloc] init]

    Однако годится для т.н. «не перекрытого» создания (инициализации) объектов.
    Т.е., +alloc/-init вызываются безусловно, без возможности передачи неких ваших данных в вызываемый объект в момент инициализации.
    Пруфлинк: NSObject Reference
    • +1
      именно это в статье и написано, только другими словами. хотя, пожалуй, на этом действительно нужно было сделать более сильный акцент.
  • +1
    Да, а теперь если прикинуть, сколько сотен тысяч разработчиков Apple нагнул на Objective-C, становится просто жутко…

    Интересно, есть ли профсоюзы для программистов?
    • +1
      Да, а теперь если прикинуть, сколько сотен тысяч разработчиков Microsoft нагнул на C++, становится просто жутко…

      Интересно, есть ли профсоюзы для программистов?
      • 0
        Точнее, на С++, на VB, на C#, на F#, на M…

        Так и широкие мышцы спины можно прокачать нагибаясь-разгибаясь :)
  • 0
    [someString isEndedWithString:anotherString withIgnoreCase:YES andCultureInfo:someCulture];

    [[someString getSubstringStartedAtIndex:1] isEndedWith:[anotherString Trim] withIgnoreCase:YES andCultureInfo:[CultureInfo getCurrentCulture]];

    -(int)sumOfFirstNumber:(int)firstNumber andSecondNumber:(int)secondNumber;

    Сделайте мне это развидеть. Теперь понятно что разработчикам платят так много — за мазахизм.
    • +1
      Это многократно лучше, чем N шаблонов C++, да сдобренные приведением типов, да щедро обмазанные гораздо менее наглядным менеджментом памяти :) И вполне читабельно, хоть и густовато.
    • +1
      в последний C# кстати тоже добавили Named Arguments
      msdn.microsoft.com/en-us/library/dd264739.aspx
      • –4
        Так разве кто против, это нужная фича, веть как реализовано просто:

        Console.WriteLine(CalculateBMI(weight: 123, height: 64));

        А теперь посмотрите на код objective-c.

        Цель Objective-C — быть максимально схожим с английским языком.

        Процедура ЗагрузкаИзТХТФайла()
        Спр=СоздатьОбъект(«Справочник.Номенклатура»);
        ИМФ=«D:\номенклатура.txt»;
        Док=СоздатьОбъект(«Текст»);
        Док.Открыть(ИМФ);
        Если Док.КоличествоСтрок()=0 Тогда
        Предупреждение(«Загружаемый справочник пустой!»);
        Возврат;
        КонецЕсли;
        Для я=1 по Док.КоличествоСтрок() Цикл
        Стр=Док.ПолучитьСтроку(я);
        Эл=Лев(стр,1);
        Если Эл=«0» Тогда
        Спр.ИспользоватьРодителя(0);
        Спр.НоваяГруппа();
        Спр.Наименование=Сред(стр,3);
        Спр.Записать();
        ЭтаГр=Спр.ТекущийЭлемент();
        Спр.ИспользоватьРодителя(ЭтаГР);
        иначе
        Спр.Новый();
        Спр.ИспользоватьРодителя(ЭтаГР);
        Спр.Наименование=Лев(стр,10);
        Спр.Записать();
        КонецЕсли;
        КонецЦикла;
        КонецПроцедуры
        • +2
          а в чем проблема objective-c?
          там бы выглядело [self calculateBMIwithWeight:123 andHeight:64];
          я какой-то режущей глаз разницы не вижу
  • 0
    отлично, то что надо. Как раз хочу начать изучать Objective-C
  • –3
    Жутковато от таких статей становится.

    Выучите ANSI C, блеать!
  • 0
    Как борятся с циклическими ссылками?
    • +1
      роняют программу с OutOfMemory? ;)
  • 0
    А каковы были причины перехода с создания десктопных приложений на мобильные (C# -> iPhone)?
    • 0
      переход был с web-приложений (ASP.NET) на мобильные (iPhone) (хотя и десктопными я занимался, но это было уже почти два года назад). да и не переход это был, а скорее еще одно начинание — работать с .NET платформой продолжаю.
      причина простая — увидели перспективу в этом рынке.
  • +3
    А ещё у Objective-C нет NameSpace
    Ну и без Linq, Entity Framework, Generics грустно.
    А в этих retain, release лишний геморой, по началу интересно вот какой я гуру всё контролирую, а потом понимаешь что это лишняя трата времени и лучше бы это всё было автоматизированно.
  • 0
    Скажите, апплстор принимает программы написанные на C#.Net? или все по старому? т.к. стою перед выбором, учить c# или obj-c?
    • 0
      да, можно писать на C#. Только учитите, что нативные средства для более-менее сложных приложений всегда лучше, чем другие инструменты. Но C# вам пригодится далеко не только в мобильной разработке. Так что зависит от ваших планов. Хотя и оба языка знать — тоже неплохо;)
      инструмены — MonoTouch, Unity3D. Слышал только про эти фреймвоки, поддерживающие разработку под iOS на C#.
      • 0
        Спасибо за разъяснение, все же останусь на изучении обж-с.

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