Компания Apple предоставляет широкий выбор инструментальных средств для разработки прикладных программ для операционной системы iOS, которые выглядят и ведут себя так, как вы того хотите.
Для того чтобы создавать приложения для операционной системы iOS, вам надо разговаривать с ней.
Язык программирования С является компилируемым языком. Вы пишете свою программу в виде текста; для того чтобы ее запустить, следует выполнить два этапа. На первом текст компилируется в машинные команды; затем эти машинные команды выполняются. Таким образом, как и в любом компилируемом языке программирования, вы можете делать ошибки двух типов.
Язык программирования С - строго типизированный. Каждая переменная до ее использования должна быть объявлена, и должен быть указан ее тип данных.
Язык С предлагает только несколько простых собственных типов данных. Каким же образом создавать более сложные типы данных? Существуют три способа: структуры, указатели и массивы. Структуры и указатели играют огромную роль при программировании для IOS. Массивы языка программирования С требуются гораздо реже, потому что Objective-C имеет свой собственный объектный тип NSArray.
Другим способом расширения набора типов, данных в языке программирования С являются указатели (K&R 5.1). Указатель представляет собой целое число (того или иного размера), обозначающее адрес в памяти, где находятся реальные данные.
Массив С (K&R 5.3) состоит из нескольких элементов одного и того же типа данных.
Арифметические операторы очень просты (Kd-R 2.5), но надо не забывать о следующем правиле: "целочисленное деление усекает дробную часть".
Управление потоком достаточно простое и обычно включает условие в круглых скобках и блок выполняемого кода в фигурных скобках.
Язык программирования С является языком на основе функций (K&R 4.1). Функция представляет собой блок кода, определяющий, что должно быть сделано. Когда другой код вызывает эту функцию, выполняется ее код. Функция возвращает значение, которое подставляется как результат вызова функции.
Язык Objective-C переполнен указателями (и звездочками), поскольку именно так он обращается к объектам. Методы Objective-C работают в основном с объектами, так что обычно они ожидают параметры-указатели и возвращают значения-указатели.
По мере развития вашей программы ее можно разделить и организовать в виде нескольких файлов. Такой вид организации может сделать большую программу гораздо более легкой в обслуживании — ее легче читать, легче понимать, легче внести изменения и при этом не внести ошибки.
В вашем распоряжении имеется большая коллекция встроенных библиотечных файлов С. Библиотечный файл представляет собой централизованный набор функций С, вместе с сопутствующим . h-файлом, который можно включать в свой код, чтобы сделать эти библиотечные функции доступными для вашего кода.
Из других доступных программисту директив препроцессора чаще всего используется директива #define. За ней следует имя и значение; во время обработки исходного текста препроцессором имя в файле с кодом заменяется указанным значением.
Тип данных переменной может быть объявлен с квалификатором перед именем типа. Это добавление влияет на то, как эта переменная может использоваться в программе.
Objective-C, “родной” язык для программирования интерфейса API каркаса Cocoa, является объектно-ориентированным языком, и чтобы его использовать, программист должен понимать природу объектов и объектно-ориентированного программирования.
В компьютерной программе ничто не происходит без указания о том, что оно должно произойти. В программе на языке программирования С весь код принадлежит функции и не выполняется, если функция не вызывается.
Теперь мы переходим к очень характерным возможностям объектно-ориентированного программирования. Как и в реальном мире, каждый объект в мире объектно-ориентированного программирования имеет некоторый тип.
Я уже говорил, что в программе ничего не происходит до тех пор, пока объекту не отправляется сообщение. Но я также сказал, что экземпляров нет до тех пор, пока программа их не создаст.
Теперь, когда я показал, что классы являются объектами и им могут быть отправлены сообщения, вы можете удивиться — зачем тогда вообще нужны экземпляры? Почему для объектно-ориентированного программирования недостаточно существования классов как объектов?
Подытожить природу объектов можно двумя фразами: инкапсуляция функциональности и поддержка состояния. (Много лет назад я уже воспользовался этими фразами в своей книге REALbasic: The Definitive Guide.)
Одним из первых объектно-ориентированных языков программирования, получивших широкое распространение, был Smalltalk.
Ссылка представляет собой именно то, что вы себе представляете, — способ выбора некоторой определенной отдельной сущности. Особенно хороший вид ссылки — имя.
Простое объявление типа ссылки на экземпляр не влечет за собой существование соответствующего экземпляра.
Как я уже говорил в главе 1, присвоение указателю не приводит к изменению значения, которое находится “на дальнем конце указателя”, на которое он указывает; это просто перенацеливание указателя.
“Указательная” природа ссылок на экземпляры в Objective-C имеет определенные последствия для системы управления памятью.
Метод в Objective-C определен как часть класса. Он имеет три аспекта.
Чтобы отправить сообщение объекту, используется выражение сообщения, которое также называют для простоты и по аналогии с функциями С вызовом метода.
Объявление метода представляет собой определяющую открытую инструкцию, указывающую имя метода, тип данных возвращаемого значения и типы данных каждого из его параметров.
Там, где в вызове метода должен находиться объект определенного типа, можно поместить еще один вызов метода, который возвращает этот тип.
Тип данных, возвращаемых методом вместе с типами данных каждого из его параметров в порядке передачи этих параметров методу, составляют сигнатуру этого метода.
В языке Objective-C не такая уж редкость методы, требующие неизвестное количество параметров.
Механизм отправки сообщений имеет фундаментальное значение для Objective-C.
Ссылке на экземпляр очень легко оказаться указывающей на не экземпляр — то есть на nil.
Возможна ситуация с отправкой сообщения объекту, у которого нет соответствующего метода.
Иногда компилятор, пытаясь спасти вас от ситуации нераспознанного селектора, выдает предупреждение или сообщение об ошибке, в то время как вы очень хорошо знаете, что то, что вы пытаетесь сделать, — безопасно и правильно.
Предыдущие разделы вращалась вокруг того факта, что Objective-C до времени выполнения не знает, какому объекту посылается сообщение.
Хотя ваш код, несомненно, будет вызывать массу методов Objective-C, вероятно, он также будет вызывать и некоторые функции С.
Многие объектные типы Objective-C имеют низкоуровневые аналоги С, вместе с функциями С для работы с ними.
Блок представляет собой расширение языка С, введенное в OS X 10.6 и доступное начиная с iOS 4.0.
В этой главе описаны некоторые лингвистические и структурные особенности Objective-C, связанные с классами; в следующей главе мы рассмотрим то же самое по отношению к экземплярам.
Как вы знаете из главы 2, весь ваш код располагается в том или ином классе. Поэтому первое, что мы должны сделать, — это указать, что понимается под помещением кода “в класс” в языке Objective-C. Как Objective-C решает, лингвистически и структурно, что “данный код предназначен для такого-то класса”?
Интерфейс и реализация класса вполне могут находиться в одном и том же файле, как и несколько классов могут быть определены в одном файле, но обычно это не так.
Методы классов в общем случае имеют два основных применения.
Метод класса может вызываться с помощью отправки сообщения непосредственно имени класса.
Экземпляры являются сердцем активности программы на языке Objective-C.
Объекты ваших классов создаются автоматически во время запуска программы, но экземпляры должны создаваться индивидуально в процессе работы программы.
Один из способов создания экземпляров — косвенный, путем вызова кода, который создает экземпляр за вас.
Альтернативой получению готового экземпляра является явное требование к классу создать экземпляр.
Третий способ создания экземпляра — с помощью nib-файла. Nib-файл представляет собой файл в созданном приложении, сгенерированный из .storyboard-файла или . xib-файла, в котором вы “рисуете” части пользовательского интерфейса.
Для данных подкласса и суперкласса можно свободно подставлять экземпляр подкласса там, где требуется экземпляр суперкласса.
Распространена ситуация, когда в коде метода экземпляра, определенного в классе, необходимо вызывать другой метод экземпляра, определенный в том же классе.
Иногда (а при работе с каркасом Cocoa достаточно часто) требуется заместить унаследованный метод, но при этом оставить возможность доступа к замещаемой функциональности.
В главе 3, я пояснял, что одной из главных причин существования экземпляров, а не просто классов, является то, что экземпляры могут иметь переменные экземпляра.
Язык Objective-C предоставляет средство для перевода строки в вызов метода доступа, которое называется кодированием ключ-значение (key-value coding).
Свойство представляет собой синтаксическую возможность современного языка программирования Objective-C, разработанную в качестве альтернативы стандартному синтаксису методов доступа.
Теперь, когда вы знаете о ключевых словах self и super и переменных экземпляра, мы можем вернуться к теме, которую я беспечно пропустил ранее.
Эта глава в основном сконцентрирована на механике создания экземпляра. Однако зачастую ваш код будет связан не с созданием нового экземпляра, а со ссылкой на экземпляр, который уже существует.
К данному моменту вы, несомненно, страстно желаете вскочить и начать писать приложение.
Xcode — это приложение, которое используется для разработки приложений в системе iOS.
Еще до того, как вы напишете первую строчку кода, проект Xcode уже имеет довольно богатое содержание.
Проект Xcode содержит множество информации о том, какие файлы образуют проект и как они используются при создании приложения.
Панель навигатора представляет собой столбец информации, расположенный в левой части окна проекта.
Панель утилит — это столбец в правой части окна проекта. Она содержит инспекторы, предоставляющие информацию о текущем выборе или настройках; если настройки допускают изменения, то это можно сделать именно здесь.
В центре окна проекта находится редактор. Именно здесь выполняется реальная работа, чтение и запись кода (см. главу 9), а также разработка интерфейса в файлах . storyboard или . xib.
Первый элемент в навигаторе проекта (<Command+l>) представляет собой сам проект. (В проекте Empty Window, созданном в этой главе ранее, этот пункт назывался Empty Window.)
Цель (target) — это коллекция компонентов, а также правил и настроек для сборки продукта из этих компонентов. Когда вы выполняете сборку, вы на самом деле создаете цель.
Отредактируйте цель Empty Window и щелкните на пункте Build Phases в верхней части редактора (рис. 6.8). Вы увидите этапы, из которых состоит сборка приложения.
Фазы сборки — это лишь один аспект механизма, позволяющего цели выяснять способ сборки приложения. Вторым аспектом являются настройки.
Значения настроек сборки образуют несколько списков, хотя в конкретной сборке применяется только один список.
До сих пор я ничего не говорил о том, как среда Xcode узнает, какую конфигурацию использовать для конкретной сборки.
Имя, присвоенное вашему проекту в процессе его создания, используется во многих местах. Это создает у новичков ложное мнение, что они никогда не смогут переименовать проект, не испортив его.
Файл приложения представляет собой папку особого вида, которая называется пакетом (package), а специальная разновидность пакета называется комплектом (bundle).
Среда Xcode, проект и цель выясняют значения настроек сборки, причем некоторые из них могут отличаться в зависимости от конфигурации сборки.
Nib-файл — это описание фрагмента пользовательского интерфейса в скомпилированном формате в файле с расширением . nib.
Ресурсы — это вспомогательные файлы, встроенные в комплект вашего приложения, для того чтобы извлечь их при выполнении приложения. К ним относятся, например, изображения, которые вы хотите вывести на экран, или звуки, которые хотите воспроизвести.
В процессе сборки исходные файлы, подлежащие компиляции для создания бинарного приложения, известны, потому что они перечисляются в фазе сборки целевого приложения Compile Sources.
Каркас — это библиотека скомпилированного кода, который используется вашей программой.
Термин nib — это сокращение от “NeXTStep Interface Builder”, которое использовалось в качестве расширения файлов . nib.
Рассмотрим интерфейс nib-редактора в среде Xcode.
Структура документа иерархически отображает отношения между объектами в nib-файле и немного отличается в зависимости от того, какой файл редактируется — . storyboard или .xib.
Канва обеспечивает графическое изображение nib-объекта интерфейса верхнего уровня вместе с его дочерними представлениями, аналогично любому графическому редактору.
Вместе с nib-редактором открываются четыре инспектора, которые применяются к любому объекту, выбранному в структуре документа, в доке или на канве.
Nib-файл — это коллекция потенциальных экземпляров, которые называются nib-объек-тами.
При загрузке nib-файла, когда возникают его экземпляры, существует одна проблема: эти экземпляры бесполезны.
Часто возникает необходимость самостоятельно создать выход. Для того чтобы продемонстрировать, как это делается, будем использовать проект Empty Window.
При настройке выхода необходимо одновременно выполнить несколько условий. Если вы не сделаете этого, то рано или поздно ваш выход станет работать неправильно.
Для того чтобы правильно удалить выход, т.е. не вызвать ни одной проблемы, перечисленной в предыдущем разделе, требуется внести несколько изменений в разных местах, как это было и при создании выхода.
Ранее мы создали выход вручную, объявив свойство в заголовочном файле класса и проведя соединительную линию от кружка выхода в инспекторе связей в nib-редакторе к кнопке.
Связь выхода — это переменная экземпляра класса NSArray (в коде), имеющая (в nib-файле) многочисленные связи с объектами того же типа.
Кроме связей выходов в nib-файле существуют связи действий. Связь действия, как и связь выхода, — это способ, позволяющий одному объекту в nib-файле ссылаться на другой объект.
После завершения загрузки nib-файла его экземпляры являются абсолютно полноценными; они инициализированы и настроены с помощью всех атрибутов, указанных в окнах инспекторов атрибутов и размеров, а их выводы были использованы для задания значений соответствующих переменных экземпляров.
Знание бывает двух видов. Мы либо знаем предмет, либо знаем, где найти информацию о нем.
Сэмюэль Джонсон, Биография
Основным механизмом доступа к документации в среде Xcode является справочное окно (Help1^Documentation and API Reference, <Command+Option+Shift+?>).
В подавляющем большинстве случаев искомой страницей документации является справка о классе.
Компания Apple предоставляет большое количество образцов кода для проектов.
Справка Quick Help — это лаконичная документация о конкретных темах, обычно об имени символа (класса или метода).
Символ — это глобально определенный термин, например имя класса, метода или переменной экземпляра.
Иногда полезной формой документации может стать заголовочный файл.