Подтвердить что ты не робот

Разница между objective-c и java

У меня есть опыт работы с Java и вы хотите узнать, что objective-c для написания приложений для iPhone. Каковы некоторые фундаментальные различия? (кроме синтаксиса)

4b9b3361

Ответ 1

Понятно, что наибольшее различие заключается в том, что Objective-C динамически типизируется и вы не вызываете методы, вы отправляете сообщения. Это означает, что во время выполнения Objective-C неважно, какой тип будет иметь ваш объект, только если он будет отвечать на отправленные вами сообщения. Это, в свою очередь, означает, что вы могли бы (например) создать класс с помощью метода objectForIndex: и использовать его вместо NSArray, если код, который его использует, вызывает вызовы objectForIndex:

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

На более практическом уровне вы заметите:

  • синтаксис отличается
  • Управление памятью более ручное. На iPhone вам нужно использовать сохранение/освобождение (у OS X есть сборка мусора). Это не так плохо, как кажется. Если вы следуете правилам и обертываете свои переменные экземпляра в геттеры и сеттеры, вам редко приходится писать сохранение или выпуск. Обновление: спустя некоторое время после того, как я это написал, Apple представила автоматический подсчет ссылок (ARC). ARC выросла из-за того, что статический анализатор clang способен обнаруживать почти каждый оставшийся (или дополнительный) удержание или выпуск. Таким образом, они расширили этот принцип за счет того, что компилятор автоматически помещается в резервные копии и релизы. Помимо некоторых простых правил о сильных и слабых отношениях (т.е. Является ли объект претензией на принадлежность другому объекту или нет), вы можете более или менее забыть об управлении памятью. Кроме того, ARC доступен на iOS.
  • Все методы являются общедоступными. Это прямое следствие парадигмы отправки сообщений, но вы не можете определить частные или защищенные методы.
  • Библиотека намного меньше. В частности, вы заметите, что есть только три класса коллекции NSArray, NSDictionary и NSSet (плюс их изменяемые версии). Философия заключается в том, что вы программируете интерфейс. Время выполнения беспокоится о том, какова должна быть реализация.

ETA: Я забыл одну важную вещь, вы пропустите из Java. Objective-C не поддерживает пространства имен. Вот почему вы увидите классы Objective-C с двумя (или более) префиксами букв, и это функция, которую я действительно хотел бы добавить.

Ответ 2

Во-первых, Objective-C не предоставляет сборщик мусора для iPhone. На Mac присутствует сборщик мусора.

Но, возможно, самая большая разница для меня в том, что для каждого класса есть 2 файла. Заголовочный файл (.h), где вы должны объявлять переменные, свойства и методы экземпляра. Тогда это файл реализации (.m), в котором вы пишете свои методы. Свойства в Objective-C должны быть "синтезированы" с помощью ключевого слова @synthesize для создания методов getter и setter.

Переход не так уж плох. Оба языка следуют аналогичным правилам с точки зрения объектных моделей и даже некоторых синтаксисов. Я фактически сделал противоположный переход. Я начал с Objective-C для iPhone, а затем взял Java для разработки Android.

В несвязанной заметке, создание пользовательского интерфейса намного проще с помощью инструментов Apple. Конструктор интерфейсов просто прост. Слияние объектов UI в файлах nib с их объявлениями в коде настолько просто. Инструменты обеспечивают простой способ проверить использование ЦП, утечки памяти, распределения и т.д. Кроме того, только с точки зрения возможностей, общего блеска и простоты использования, я буду использовать инструменты XCode и Apple для Eclipse в любой день.

Если вы "свободно" на Java, переход на Objective-C будет не слишком сложным. Просто запустите свои [] ключи и наберите "release"!

Ответ 4

Самая большая разница, которая сразу же повлияет на вас, помимо совершенно другого набора библиотек [1], заключается в том, что Objective-C не предоставляет сборщик мусора. Библиотеки Apple предоставляют некоторые связанные с мусором процедуры и объекты, я считаю, используя подсчет ссылок, но у вас нет коллекции мусора, с которой вы привыкли в Java.

Кроме того, многие вещи будут похожи: одно наследование, позднее связывание и т.д. Objective C не обеспечивает перегрузку метода, но это несколько тривиальное различие. Java и Objective-C не слишком далеки друг от друга в плане того, как работает их объектная модель. Obj. C имеет несколько трюков в рукаве, таких как категории, но сначала вам не нужно беспокоиться о них.

См. связанный вопрос С#, предложенный Ремусом для получения дополнительной (и более подробной) информации (и благодаря Remus для напоминания мне о различии в библиотеке - я почти забыл этот важный аспект).

Ответ 5

Любой объект, объявленный в Objective C, является указателем другого