Objective-C после Java

Волей судеб мне посчастливилось изучать еще один язык под присмотром опытного разработчика. Вот, что делает нехватка кадров ios разработчиков. Поэтому решено было сразу законспектировать все сложные моменты перехода от java к Objective-C. Попутно делится с коллегами информацией о различиях.

Тема обширная, в этот раз опишу различия идеологические и синтаксические, субъективные

Идеология

Язык является надстройкой над С. Поэтому Objective-C наследует синтаксис, примитивные типы данных, операторы потокового управления(if else, for и т.д.) и добавляет синтаксис для определения классов и объектов. Так же добавляет поддержку на уровне языка объектных графов и литералов, обеспечивает динамическую типизацию и привязку во время runtime.

Отправка/получение сообщений

В первую очередь это «отправка/получение сообщений» объектам. Парадигма знакомая еще со smalltalk, для тех кто изучал его в институте. Объекты могут взаимодействовать между собой через «отправку» и «получение» сообщений. С точки зрения синтаксиса это мало чем отличается от вызова метода в java, кроме квадратных скобочек, естественно.

[someObject doSomething];

Но с точки зрения компилятора это уже совсем другая история(да, капитан). Если в java мы передаем в метод: ссылки на объект и непосредственно значения в случае с примитивами. То в Objective-C появляются указатели объектов получателей сообщений.

Указатели

Указатель представляет собой тип данных C, но при этом он может указывать на все, что угодно. Таким образом, в Objective-C каждая ссылка на объект является указателем (и Objective-C сам заботится о выяснении, на что этот указатель указывает). Если переменная явно ссылается на экземпляр класса MyClass, то она имеет тип MyClass*, т.е. является указателем на MyClass. В общем случае, ссылка на экземпляр класса является указателем, а имя типа данных, на который указывает этот указатель, представляет собой имя класса этого экземпляра

Синтаксис

Чтение

Было замечено не только мной в сложностях чтения кода objective-c. В особенности его методов. Разберем пример.

[лесничий рубит: (Лес *) лес сПорубочными: (Билет *) билетами];

Имя метода составное : ЛесничийРубит сПорубочными

Это обычно главное предкновние перед начинающими ObjectiveC программистов. На Java это обычно выглядело бы так:

/**
 * Метод профилактичской очистки леса от кароеда
 * @param лес Лес в стране лесоруба
 * @param билет Порубочный билет для работы
 */
лесничий.рубит(Лес лес, Билет билет);

Сложности с чтением обычно проходят в первую неделю )

@Свойства

Элегантное решение для генерации getter и setter, без лишнего кода с атрибутами, подробно писали на хабре

 

  • атрибуты доступности (readonly/readwrite)
  • атрибуты владения (retain/strong/copy/assign/unsafe_unretained/weak)
  • атрибут атомарности (atomic/nonatomic)
  • nullability атрибут (null_unspecified/null_resettable/nullable/nonnull)

 InterfaceBuilder

Это вообще «мышиное» программирование интерфейса. Но в отличии от Android, функционала поболее.

interface-builder_2x

Storyboards

Можно написать приложение iOS  без строчки кода, используя только storyboard’ы. Реализовать наглядное представление приложение со связями между ними можно в два клика мышки.

Но для расширение связи кода и storyboard используется assistant. Action’ы и Outlet’ы, которые имеют связь со storyboard. Зажимая ctrl мы можем создать их прямо из интерфейса.

assistant_2x

Auto Layout

Хоть у ios и не такой широкий спектр устройств, как у Android, но есть механизм масштабирования для элементов интерфейса, реализуемые через constraints.

Субъективное

Для программистов изучение языка — это лишь освоение нового инструмента. Если вы до objc знали язык с объектно-ориентированной парадигмой, то программировать вы уже сможете через месяц. Но с инструментом приходит и ответственность, чтобы не «выстрелить себе в ногу» retain cycle’ом и многим другим. На это понадобиться больше времени.

Добавить комментарий