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

Свойства и методы доступа

Мы видели, что объект может быть невидимым, как массив или строка. Позже я покажу видимые объекты, такие как текстовое поле или картинка. Итак, что же такое объект?

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

Давайте вернемся к нашему примеру со статьи Интерфейс класса. В этой статье мы создали класс MyClass, который имеет две переменные (name и adress). Затем для этих классов мы сами написали методы доступа. Но зачем нам это нужно? Дело в том, что переменные класса недоступны другим объектам (закрыты для других классов), они доступны только своим методам. А уже методы доступны вне объекта. Таким образом чтобы сделать переменную доступной, нужно создать пару методов для доступа и изменения к этой переменной. Вот как раз эти «свои» методы мы и создали.

Как вы заметили, эти методы достаточно просты и для их обобщения Objective-C 2.0 внедряют новые возможности языка. Новой особенностью, о которой мы говорим, является суммирование свойств. Акксессоры настолько распространены, что эта долгожданная поддержка языкового уровня может привести к значительно меньшему количеству кода. И меньше кода означает меньше кода для отладки.

Так чем свойства отличаются от аксессоров? По существу свойство создает акксессор напрямую, используя наиболее эффективное и правильное управление памятью. Иными словами, они пишут акксессоры для вас, но в фоновом режиме, чтобы вы никогда не увидели код.

Давайте перепишем наш пример со статьи Интерфейс класса.

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

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

@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *adress;

@end</code>

Директива @property как раз и определяет свойство объекта. “retain” в скобках означает, что реализующий это свойство set-методдолжен получать новое значение отправкой сообщений retain. Теперь посмотрим, что изменилось в реализации нашего класса:

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

@implementation MyClass

@synthesize name;
@synthesize adress;

- (void) dealloc { 
    self.name = nil; 
    self.adress = nil; 
    [super dealloc];
}

- (id) init { 
    if (self = [super init]) {
        [self setName:@"Ira"]; 
        [self setAdress:@"K. Marksa st."];
    }

    return self;
}

@end</code>

Директива @synthesize автоматически генерирует set- и get-методы для нас, так что единственное что мы должны реализовать в этом классе — метод dealloc.

То есть, код со статьи Интерфейс класса эквивалентен коду, который мы только что написали. И работать они будут одинаково. Разница лишь в количестве кода, который мы используем для реализации поставленной задачи.

Немаловажным моментом в этом примере является расположение метода dealloc. Я советую его помещать под директивами@synthesize. Это уменьшит случаи забывания очистки объектов из памяти.

Дальнейшее обсуждение и рассмотрение возможных ошибок по работе с методами доступа и свойствами проходит в этой ветке форума.

Comments are closed.