ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C Часть 1

Интерфейс класса

До этого урока мы работали с кодом, который расположен в реализации класса (className.m). Даже более того, мы не выходили за рамки одной функции. Пришло время узнать о хэдэре (className.h).

В хэдэре класса хранится его интерфейс, в котором описаны переменные и public методы. Реализация класса — className.m файл, содержащий фактический код для этих методов. Он также часто определяет частные методы, которые не доступны вне класса или экземпляра класса.

Давайте рассмотрим пример интерфейса:

<code data-result="[object Object]">#import &lt;Foundation/Foundation.h&gt;

@interface MyClass : NSObject {
    NSString *name;
    NSString *adress;
}

@end</code>

В первой строчке мы импортируем Foundation.h, чтобы получить доступ ко всем основным классам библиотеки Foundation. Директива#import аналигична include в C, но гарантирует что данный файл будет подключен всего один раз. Затем @interface описывает классMyClass, унаследованный от NSObject, который является прародителем всех классов в Objective-C. Внутри фигурных скобок описаны две переменные экземпляров: name и adress, обе типа NSString. И наконец, @end обозначает окончание описания класса.

Чтобы получать доступ к нашим переменным, следует добавить get-методы:

<code data-result="[object Object]">#import &lt;Foundation/Foundation.h&gt;

@interface MyClass : NSObject {
    NSString *name;
    NSString *adress;
}

- (NSString*)name; 
- (NSString*)adress;

@end</code>

Запомните, get-методы в Objective-C, как правило, опускают префикс “get” в своем имени. Минус перед названием метода показывает, что это метод экземпляра объекта. Плюс перед именем означает, что это метод класса.

А теперь добавим методы, которые будут устанавливать значение переменных (set-методы).

<code data-result="[object Object]">#import &lt;Foundation/Foundation.h&gt;

@interface MyClass : NSObject {
    NSString *name;
    NSString *adress;
}

- (NSString*)name; 
- (NSString*)adress;

- (void)setName:(NSString*)input; 
- (void)setAdress:(NSString*)input;

@end</code>

Set-методы не возвращают значений, поэтому мы определяем их как void.

Теперь напишем реализацию класса:

<code data-result="[object Object]">#import "MyClass.h"

@implementation MyClass

- (NSString*)name {
    return name;
}

- (NSString*)adress {
    return adress;
}

@end</code>

Во-первых, импортирован файл заголовка MyClass.h, таким образом компилятор знает, что ожидать. Затем следует директива@implementation и имя класса, а заканчивается директивой @end, между которыми заключена реализация нашего класса. Для простоты я начал с реализации get-методов, которые просто возвращают значение наших переменных.

Теперь перейдем к set-методам, которые рассмотрим более детально.

<code data-result="[object Object]">- (void)setName: (NSString*)input { 
    [name release]; 
    name = [input retain];
}

- (void)setAdress: (NSString*)input { 
    [adress release]; 
    adress = [input retain];
}</code>

Каждый set-метод оперирует двумя переменными. Первая — ссылка на существующий объект, вторая является новым значением. Сначала мы удаляем ссылку на старый объект, а затем получаем ссылку на новый. Более конкретно о количестве ссылок на объект описано здесь.

Кроме методов доступа мы можем написать метод инициализации объекта в котором будем инициализировать переменные значениями по умолчанию. Этот метод называется init.

<code data-result="[object Object]">- (id) init { 
    if (self = [super init]) {
        [self setName:@"Ira"]; 
        [self setAdress:@"K. Marksa st."];
    }

    return self;
}</code>

Самое интересное происходит во второй строке. В ней мы присваиваем переменной self значения вызова инициализатора унаследованного класса, в нашем случае класс NSObject. В условии if идет проверка, что инициализация прошла успешно, прежде чем приступить к присвоению нашим переменным значений.

В момент удаления объекта из памяти вызывается метод dealloc. Можно сказать, аналог деструктора. В реализации этого метода самое время удалить ссылки на объекты всех переменных.

<code data-result="[object Object]">- (void) dealloc { 
    [name release]; 
    [adress release]; 
    [super dealloc];
}</code>

В первых двух строках этого метода мы просто посылаем release для каждой из наших переменных. Последняя строка имеет очень большое значение. Мы должны послать сообщение [super dealloc] унаследованному объекту, чтобы удаление прошло корректно. Если мы забудем это сделать, то это приведет к утечкам памяти.

Comments are closed.