Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

BecomeAnXcoder.Russian

.pdf
Скачиваний:
48
Добавлен:
11.06.2015
Размер:
1.77 Mб
Скачать

31

Обзор Xcode

Теперь перед вами окно, которое вы, как программист, будете видеть очень часто. Окно

состоит из двух фреймов. Основной фрейм располагается справа и в основном в нём происходит работа с исходными кодами. «Groups & Files» — располагается слева и служит

для доступа ко всем файлам, из которых состоит ваша программа. Сейчас их не слишком много, но позже, когда вы будете работать над многоязычными графическими программами, все файлы для описания интерфейса и различных языков будут именно тут. Файлы сгруппированы и хранятся в папках, но не стоит их искать на вашем жестком диске.

Xcode предоставляет эти виртуальные папки (Groups) для организации вашего проекта.

В поле ввода «Groups & Files», попробуйте открыть группу jystatray, для того чтобы начать работать с исходным кодом в файле с именем justatry.m [42]. Вы помните, что каждая программа должна содержать функцию с именем main()? Ну вот, этот файл, содержит эту main() функцию. Позже в этой главе мы собираемся изменить его, чтобы включить его в код нашей программы. Если вы открываете justatry.m, дважды щелкнув его значок, вас ждет приятный сюрприз. Apple уже создала main() функцию для вас.

Xcode, отображающий main() функцию.

32

//[42]

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) // [42.3]

{

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; // [42.5]

// insert code here… NSLog(@"Hello, World!"); [pool drain]; //[42.9] return 0;

}

Давайте взглянем на эту программу и поищем то, что вы уже знаете:

Директива import, начинающаяся символом #, нужна для использования таких функций как NSLog;

Функция main();

Фигурные скобки, которые должны содержать тело нашей программы;

Комментарий, приглашающий писать код здесь;

Команда NSLog() для вывода строки на экран;

Команда return 0.

Есть здесь и то, что вы пока не знаете:

Забавный список аргументов в скобках функции main() [42.3];

Оператор, начинающийся на NSAutoreleasePool [42.5];

Еще один оператор со словами pool и drain [42.9].

Лично я не очень-то счастлив, когда авторы книг предлагают мне, как читателю, ознакомиться с кодом, полным непонятных операторов, обещая при этом все разъяснить позже. Ага, как же. Имено поэтому я слегка отклонился от темы чтобы познакомить вас с концепцией «функций», так что вам не прийдётся сталкиваться с большим количеством новых понятий.

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

сейчас полностью объяснить все, что вы видите в примере [42]. Я очень сожалею, но пока просто не обращайте внимания на эти строки ([42.3, 42.5 и 42.9]).

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

33

Если вы действительно не хотите быть оставленными без каких-либо объяснений, вот вам резюме:

Аргументы в main() [42.3] функции необходимы для запуска программ из Терминала. При помощи этих аргументов передаются параметры в программу (прим. редактора);

Ваша программа резервирует память [42.5]. Память, которая нужна другим программам, когда ваша программа закончила работу. Ваша задача резервировать память, которая нужна вашей программе;

И не менее важно: освобождение памяти, когда она не нужна [42.9].

Build and Go

Давайте запустим программу [42]. Нажмите вторую иконку «с молотком» помеченную как «Build and Go» для постройки (сборки) и запуска приложения.

Кнопка Build and Go

Программа выполняется и результаты выводятся в окно «Console» (сделать видимым его можно, находясь в Xcode, выбрав пункты меню Run Console R), вместе с дополнительной

информацией. Последняя строчка сообщает нам, что программа завершилась с кодом 0. Этот как раз тот 0, который вернула функция main(), которую мы обсуждали в Главе 3 [28.11].

Значит наша программа выполнилась до последней строчки и нигде не прервалась раньше времени. Уже хорошо!

Баггинг

Вернемся к примеру [42] и посмотрим, что произойдет, если имеется ошибка в программе. Например, я поменял функцию NSLog(), но забыл поставить точку с запятой в конце команды.

34

//[43]

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])

{

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; // insert code here...

NSLog(@"Юля — моя любимая актрисса") // Упс, забыл поставить точку с запятой!

[pool drain]; //[43.9] return 0;

}

Чтобы построить приложение, нажмите иконку «Build and Go» на панели. Перед командой [43.9] появится красный круг.

Xcode указывает на ошибку компиляции.

Если вы кликните его, строчка под тулбаром покажет короткое пояснение ошибки:

error: syntax error before "drain"

Синтаксический анализ, или парсинг — один из первых этапов работы компилятора: он проходит по каждой строчке кода, чтобы проверить может ли он её понять. И вы должны помочь ему в этом, размещая подсказки. Например, для директивы import надо использовать символ #, а конец оператора надо отмечать c помощью точки с запятой (;). В нашем случае, когда компилятор доходит до строчки [43.9], он замечает, что что-то не так. Однако, он не понимает, что проблема не в этой строке, а в предыдущей, где не хватает точки с запятой (компилятор считает данную запись из двух операторов одним оператором, которую не может разобрать — прим. редактора). Важный вывод для нас состоит в том, что хотя

35

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

Исправьте код добавив точку с запятой, и запустите программу еще раз, чтобы убедиться что теперь все в порядке.

Наше первое приложение

А сейчас давайте возьмем код из предыдущей главы и объединим его с кодом, который приготовил для нас Apple ([42]). В результате получим пример [44].

//[44]

#import <Foundation/Foundation.h>

float circleArea(float theRadius); // [44.4]

float rectangleArea(float width, float height); // [44.5]

int main (int argc, const char * argv[]) // [44.7]

{

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int pictureWidth;

float pictureHeight, pictureSurfaceArea, circleRadius, circleSurfaceArea;

pictureWidth = 8; pictureHeight = 4.5; circleRadius = 5.0;

pictureSurfaceArea = pictureWidth * pictureHeight; circleSurfaceArea = circleArea(circleRadius); NSLog(@"Площадь картинки: %f. Площадь окружности: %10.2f.",

pictureSurfaceArea, circleSurfaceArea); [pool drain];

return 0;

}

float circleArea(float theRadius) // [44.24]

{

float theArea;

theArea = 3.14159 * theRadius * theRadius; return theArea;

}

float rectangleArea(float width, float height) // [44.31]

{

return width *height;

}

Убедитесь, что вы понимаете структуру программы. У нас имеются заголовки [44.4, 44.5] созданных нами функций circleArea() [44.24] и rectangleArea() [44.31], находящиеся выше функции main() [44.7], где они и должны быть. Наши функции находятся вне

36

фигурных скобок функции main() [44.8, 44,22]. Мы набираем текст программы внутри тела функции main(), где это и советует делать Apple.

После исполнения кода, мы увидим:

Площадь картинки: 36.000000.

Площадь окружности:

78.54.

The Debugger has exited with

status 0.

 

Отладка

Когда программа усложняется, отладка выполняется труднее. Поэтому периодически возникает необходимость узнать, что происходит внутри программы в момент её выполнения. С этой задачей также с успехом справляется Xcode, необходимо лишь нажать левой кнопкой

мыши на серой границе перед выражениями, для которых вы хотите узнать значения переменных и Xcode добавить в этом месте точку остановки — breakpoint, отмеченную

голубой стрелкой.

Установка точки остановки в коде

Запомните, вы увидите значения переменных до выполнения строки с точкой остановки, так что ставьте точку остановки в следующей строке после изменения нужного значения.

Нажав «Build and Go (Debug)» (Run Debug Y), перед вами будет оно Xcode в режиме отладки.

37

Xcode в режиме отладки позволяет выполнять программу шаг за шагом и проверять переменные.

Программа будет выполняться до того момента как достигнет первой точки остановки. Если выбрать верхнюю правую панель в отладчике (Debugger. Для открытия отладчика

Run Debugger Y), то вы сможете увидеть значения различных переменных. Любые значения, которые изменились с момента отображения последней точки остановки выделены красным цветом. Для продолжения выполнения нажмите кнопку «Continue». Отладчик — мощный инструмент, который поможет разобраться со многими ошибками, возникающими при написании программ. Поиграйтесь с ним некоторое время, чтобы поплотнее с ним ознакомиться.

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

Mac OS X.

Если вы не хотите делать программы с графическим пользовательским интерфейсом (GUI), единственное что вам нужно сейчас — увеличить ваши знания Objective-C, что позволит

разрабатывать более сложные программы. В течение следующих нескольких глав мы будем делать именно это. После чего мы будем погружаться приложения с GUI.

38

Окно отладчика в процессе работы с программой.

Глава 6: Условные операторы

Оператор условного перехода if()

Для того, чтобы ваш код выполнял последовательность действий только если выполнено конкретное условие, существуют специальные ключевые слова [45.3].

//[45]

// age это целочисленная переменная, хранящая возраст пользователя if (age > 30) // Символ > означает "больше чем"

{

NSLog(@"Старше 30 лет."); //[45.5]

}

NSLog(@"Завершено."); //[45.7]

Строка [45.3] демонстрирует инструкцию if(), также известную, как условную инструкцию. Вы наверняка обратили внимание на фигурные скобки, которые содержат весь код, который вы хотите выполнить при условии, что логические выражения в скобках являются верными. Так, строка [45.5] будет распечатана, если условие age > 30 выполнимо. Однако строка [45.7] будет распечатана независимо от того, выполнимо условие или нет, потому как находится не внутри фигурных скобок.

Оператор условного перехода if() (полная конструкция)

Мы также можем предоставить альтернативный набор инструкций, если условие не выполняется, используя команды if и else [46].

//[46]

// age это целочисленная переменная, хранящая возраст пользователя if (age > 30) //[46.3]

{

NSLog(@"Старше 30 лет."); //[46.5]

}

else

{

NSLog(@"Моложе 30 лет."); //[46.9]

}

NSLog(@"Завершено.");

Строка кода [46.9] может быть выведена только в том случае, если условие [46.3] не выполняется.

40

Сравнения

Помимо тех операторов, которые мы привели в примерах, возможно применение следующих операторов сравнения числовых значений:

== равенство > больше чем

<меньше чем

>= больше или равно <= меньше или равно != не равно

Учтите, что оператор равенства это двойной знак равенства. Это легко забыть и пользоваться одним знаком равенства по привычке. Но одиночный знак равенства это оператор присваивания, который выполнит присваивание следующего по коду выражения, что является причиной проблем и кода, содержащего ошибки, у новичков. Теперь громогласно заявите: «Я никогда не забуду использовать двойной знак равенства для проверки на равенство!»

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

Давайте внимательнее взглянем на то, как происходит сравнение. Операция сравнения возвращает только одно из двух значений — истину или ложь.

В Objective-C истина и ложь представляются 1 или 0 соответственно. Даже есть специальный тип данных BOOL, который вы можете использовать для хранения таких значений. Чтобы обозначить значение «истина» можно использовать 1 или YES. Чтобы обозначить значение «ложь» можно использовать 0 или NO.

//[47] int x = 3; BOOL y;

y = (x == 4); // y примет значение 0.

Можно проверять и больше условий. Если должны выполняться два и более условия, используется логический оператор И, представляемый двумя сиволами амперсанда &&. Если должно выполняться хотя бы одно условие, используйте логический оператор ИЛИ, представляемый двумя символами вертикальной черты ||.

//[48]

if ( (age >= 18) && (age < 65) )

{

NSLog(@"Скорее всего приходиться работать.");

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]