Чтение онлайн

на главную

Жанры

Программирование на Objective-C 2.0
Шрифт:

в argv[1] сохраняется указатель на символьную строку "2" и в argv[2] сохраняется указатель на символьную строку "16". Если программа должна интерпретировать аргументы как числа (например, в случае программы power), их должна преобразовывать сама эта программа. Для таких преобразований в библиотеке профамм содержится несколько процедур: sscanf, atof, atoi, strtod и strotol. В части 11 вы узнаете, как использовать класс NSProcessInfo для доступа к аргументам ко-мандной строки как к строковым объектам, а не С-строкам. 13.8. Как это действует

Было бы упущением закончить эту главу без описания связей между некоторыми элементами. Поскольку в основе языка Objective-C лежит язык С, имеетсмысл описать некоторые связи между ними. Обратите внимание на эти детали реали-зации, чтобы лучше понять, как все это действует. Мы не будем здесь вдаваться в подробности, а просто приведем четыре факта о связях между Objective-C и С. Факт 1: переменные экземпляра сохраняются в структурах

Когда мы определяем новый класс и его переменные экземпляра, эти переменные на самом деле сохраняются в структуре. На самом деле это структуры, ком-понентами которых являются наши переменные экземпляра. Поэтому насле-дуемые переменные экземпляра плюс переменные экземпляра, которые мы добавляем в свой класс, представляют одну структуру. Если мы выделяем память для нового объекта с помощью alloc, резервируется достаточное пространство, чтобы включить одну из этих сфуктур.

Одним из наследуемых компонентов этой структуры (он поступает из кор-невого объекта) является защищенный компонент с именем isa, который указывает класс, которому принадлежит объект. Поскольку этот компонент является частью структуры (и гем самым частью объекта), он переносится вместе с объектом. Это позволяет системе runtime всегда идентифицировать класс объекта (даже если он присваивается обобщенной переменной-объекту типа id) по информации его компонента isa.

Чтобы получить непосредственный доступ к компонентам структуры объекта, можно объявить их как @public (см. главу 10). Если сделать это, например, для компонентов numerator и denominator класса Fraction, то можно писать в про-граммах такие выражения, как myFract->numerator

для непосредственного доступа к компоненту numerator объекта myFract класса Fraction. Но мы настоятельно рекомендуем не делать этого. Как говорилось в главе К), это противоречит основам инкапсуляции данных. Факт 2: переменная-объект на самом деле является указателем

Определяя переменную-объект класса Fraction, например, Fraction *myFract;

мы фактически определяем переменную-указатель с именем myFract. Эта пере-менная определяется для указания элемента типа Fraction (это имя нашего класса). При выделении памяти д ля нового экземпляра типа Fraction с помощью строки myFract = [Fraction alloc];

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

Присваивая один объект-переменную другому, как в myFract2 = myFract 1;

мы просто копируем указатели. В результате обе переменные будут указывать на одну структуру, хранящуюся в определенном месте памяти. Поэтому внесение изменений в один из компонентов, который указывается с помощью myFract2, вызывает изменения в той же переменной экземпляра (то есть в компоненте структуры), которую указывает myFractl. Факт 3: методы и функции, а также выражения с сообщениями - это вызовы функций

Методы — это на самом деле функции. При вызове метода мы вызываем функцию, связанную с классом получателя. Аргументы, передаваемые функции, это аргументы получателя (self) и метода. Поэтому все правила, касающиеся передачи аргументов функциям, возвращаемых значений, а также автоматических и статических переменных, одинаковы для функции и метода. Компилятор Objective-C создает уникальное имя для каждой функции в виде комбинации из имени класса и имени метода. Факт 4: тип id - это обобщенный тип указателя

Поскольку обращение к объектам выполняется через указатели, которые являются просто адресами памяти, мы можем легко присваивать им переменные тина id. Поэтому метод, который возвращает тип id, просто возвращает указатель на некоторый объект в памяти. Мы можем затем присвоить это значение любому объекту-переменной. Поскольку объект при его перемещении сопровождается своим компонентом isa, его класс можно всегда идентифицировать, даже если он хранится в обобщенном объекте-переменной типа id. Упражнения

Напишите функцию, которая вычисляет среднее значение 10 элементов массива с плавающей точкой и возвращает результат.

Метод reduce из класса Fraction находит наибольший общий делитель числи-теля и знаменателя (numerator и denominator) для сокращения дроби. Внесите изменения в этот метод, чтобы в нем можно было использовать функцию gcd из программы 13.5. Где следует поместить определение этой функции? Будет ли удобнее сделать эту функцию статической? Какой подход вы считаете более подходящим: использование функции gcd или включение этого кода непосредственно в метод, как мы делали это раньше? Почему?

Алгоритм, известный под названием «Решето Эратосфена», позволяет по-лучать простые числа. Ниже приводится алгоритм для этой процедуры. На-пишите программу, которая реализует этот алгоритм. Сделайте так, чтобы программа находила все простые числа до п = 150. Что вы можете сказать об этом алгоритме по сравнению с алгоритмами в этой книге для расчета простых чисел?

Шаг 1. Определить массив Р с целыми значениями. Присвоить всем элементам Pi значение 0, 2 <= i <= п. Шаг 2. Присвоить i значение 2. Шаг 3. Если i > п, алгоритм завершается. Шаг 4. Earn Pi равно 0, i — простое число. Шаг 5. Для всех положительных целых значений j, удовлетворяющих условию ixj<=n, присвоить Лх) значение 1. Шаг 6. Увеличить i на I и перейти к шагу 3.

Напишите функцию для сложения всех дробей (объектов Fraction), передава-емых ей в массиве, и возвращения результата в виде объекта Fraction.

Напишите определение typedef для структуры struct date с именем Date, чтобы в вашей программе можно было делать, например, следующие объявления. Date todaysDate;

Определение класса Date вместо структуры date больше согласуется с прин-ципами объектно-ориентированного программирования. Определите такой класс с соответствующими методами-установщиками (setter) и получателями (getter). Добавьте метод dateUpdate, чтобы возвращать день по его аргументу. Покажите преимущества определения Date в виде класса, а не в виде струк-туры.

Поделиться:
Популярные книги

Дважды одаренный

Тарс Элиан
1. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Дважды одаренный

Предопределение

Осадчук Алексей Витальевич
9. Последняя жизнь
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Предопределение

"Дальние горизонты. Дух". Компиляция. Книги 1-25

Усманов Хайдарали
Собрание сочинений
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Дальние горизонты. Дух. Компиляция. Книги 1-25

Черный Маг Императора 19

Герда Александр
19. Черный маг императора
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Черный Маг Императора 19

Барон не признает правила

Ренгач Евгений
12. Закон сильного
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Барон не признает правила

Призыватель нулевого ранга. Том 7

Дубов Дмитрий
7. Эпоха Гардара
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Призыватель нулевого ранга. Том 7

Охотник за головами

Вайс Александр
1. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Охотник за головами

Целитель

Первухин Андрей Евгеньевич
1. Целитель
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Целитель

Жрец Хаоса. Книга III

Борзых М.
3. Зов пустоты
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Жрец Хаоса. Книга III

Егерь Ладов

Шелег Дмитрий Витальевич
3. Кровь и лёд
Фантастика:
боевая фантастика
аниме
фэнтези
5.00
рейтинг книги
Егерь Ладов

Адвокат Империи 2

Карелин Сергей Витальевич
2. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 2

Точка Бифуркации IX

Смит Дейлор
9. ТБ
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Точка Бифуркации IX

Гримуар темного лорда III

Грехов Тимофей
3. Гримуар темного лорда
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар темного лорда III

Я уже князь. Книга XIX

Дрейк Сириус
19. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я уже князь. Книга XIX