Главная » iPhone, Objective-C, Программирование для iOS и MacOS » Сообщения Objective-C

0

Еще раз посмотрим на строки, в которых отправлялись эти сообщения с вызовами соответствующих методов:

NSDate *now = [NSDate date];

Метод date является методам класса. Иначе говоря, для выполнения этого метода сообщение отправляется самому классу NSDate. Метод date возвращает указатель на экземпляр NSDate.

double seconds = [now timeIntervalSince1970];

Метод timeIntervalSince1970 относится к методам экземпляров. Для его выполнения сообщение отправляется конкретному экземпляру класса. Метод timeIntervalSince1970 возвращает значение типа double.

NSDate *later = [now dateByAddingTimeInterval:100000];

Метод dateByAddingTimeInterval: также является методом экземпляра. Он получает один аргумент, на что указывает двоеточие после имени метода. Метал также возвращает указатель на экземпляр NSDate.

Вложенная отправка сообщений

Метод класса alloc возвращает указатель на новый объект, который необходимо инициализировать. Этот указатель используется для отправки новому объекту сообщения init. Использование alloc и init – самый распространенный способ создания объектов в Objective-C. Правила хорошего Стиля программирования рекомендуют отправлять оба сообщения в одной строке кода посредством вложения:

[[NSDate alloc] init];

Система сначала выполняет внутренние сообщения, а затем переходит

к внешним. Таким образом, сначала классу NSDate будет отправлено сообщение

alloc, а затем результат отправки (указатель на созданный экземпляр) получит сообщение init.

Метод init возвращает указатель на новый объект (который почти всегда совпадает с указателем, возвращенным методом alloc), что позволяет использовать

возвращенное init в команде присваивания. Проверьте, как работают вложенные сообщения – замените строку

NSDate *now = [NSDate date];

строкой

NSDate *now = [[NSDate alloc] init];

Множественные  аргументы

Некоторые методы получают несколько аргументов. Например, объект NSDate не знает, какому дню месяца он соответствует. Для получения этой информации следует использовать объект NSCa1endar. Метод NSCa1endar, который сообщает день месяца, получает три аргумента. Создайте объект NSCa1endar и используйте его в main.m:

#import <Foundation/Foundation.h>

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

{

@autoreleasepool {

NSDate *now = [[NSDate alloc] init]; NSLog(@"The date is %@", now);

double seconds = [now timeIntervalSince1970];

NSLog(@"It has been %f seconds since the start of 1970.", seconds);

NSDate *later = [now dateByAddingTimeInterval:100000]; NSLog(@"In 100,000 seconds it will be %@", later);

NSCalendar *cal = [NSCalendar currentCalendar];

NSUInteger day = [cal ordinalityOfUnit:NSDayCalendarUnit

inUnit:NSMonthCalendarUnit forDate:now];

NSLog(@"This is day %lu of the month", day);

}

return 0;

}

Сообщение называется ordinalityOfUnit:inUnit:forDate: и получает три аргумента. На это указывают три двоеточия в имени сообщения. Обратите внимание на разбивку отправляемого сообщения по трем строкам. Компилятору это нисколько не мешает – он игнорирует лишние пробелы. Программисты Objective-C обычно выравнивают двоеточия так, чтобы части имени метода можно было легко отличить от аргументов. (И Хcode вам в этом поможет: каждый раз, когда вы начинаете новую строку, предыдущая строка будет снабжаться правильным отступом. Если это не происходит, проверьте настройки отступов в Хсоdе.)

Первый и второй аргументы метода содержат константы NSDayCalendarUnit и NSMonthCalendarUnit. Эти константы определяются в классе NSCa1endar. Они сообщают методу, что вас интересует день месяца. Третий аргумент определяет дату, к которой относится запрашиваемая информация.

Если  бы  вместо  дня  месяца  вы  захотели  узнать  час  года,  то  при  вызове

следовало бы использовать следующие константы:

NSUInteger hour = [cal ordinalityOfUnit:NSHourCalendarUnit

inUnit:NSYearCalendarUnit forDate:now];

Отправка сообщений nil

Почти во всех объектно-ориентированных языках существует концепция nil – указателя, не ссылающегося ни на какой объект. В Objective-C nil представляет собой нулевой указатель (эквивалент NULL из главы 8).

В большинстве объектно-ориентированных языков отправка сообщений nil недопустима, поэтому перед обращением к объекту следует выполнить проверку на nil. По этой причине в программах часто встречаются конструкции следующего вида:

if (fido != nil) {

[fido goGetTheNewspaper];

}

В ходе разработки Objective-C было решено, что отправка сообщения nil будет допустима; просто при этом ничего не будет происходить. Соответственно, следующий код вполне допустим:

Dog *fido = nil;

[fido goGetTheNewspaper];

Важное замечание #1: если при отправке сообщения ничего не происходит, убедитесь в том, что сообщения не отправляются указателю, которому была задано значение nil.

Важное замечание #2: если вы отправляете сообщение nil, возвращаемое значение не несет полезной информации.

Dog *fido = nil;

Newspaper *daily = [fido goGetTheNewspaper];

В  этом  случае  значение  daily будет  равно  нулю.  (В  общем  случае,  если результатом является число или указатель, при отправке сообщения получателю nil

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

Упражнение

На вашем Мас имеется класс с именем NSTimeZone. В число его методов входит метод класса systemTimeZone, который возвращает часовой пояс компьютера (в виде экземпляра класса NSТimeZone), и метод экземпляра isDaylightSavingTime, который возвращает YES, если в часовом поясе в настоящее время действует летнее время.

Напишите   программу   командной   строки   Foundation,   которая   проверяет,

действует ли в настоящий момент летнее время.

Источник: Аарон Хилегас, «Objective-C. Программирование для iOS и MacOS», 2012 г.

По теме:

  • Комментарии