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

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

Рассмотрим сначала непосредственное присваивание значения переменной экземпляра. По умолчанию механизм ARC интерпретирует переменную экземпляра таким же образом, как и любую другую переменную. Это означает, что после присваивания значения этой переменной экземпляра он создает временную переменную, сохраняет в ней присвоенное значение,

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

 

self->_theData = d;

 

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

// вымышленный сценарий сохранения нового присваиваемого значения // и освобождения предыдущего значения id temp = self->_theData; self->_theData = d;

[self->_theData retain];

[temp release];

Именно так и должно было бы происходить присваивание значения переменной экземпляра без применения механизма ARC. От вашего внимания не должно ускользнуть, что именно такой код вам пришлось бы написать для создания формального метода установки, как в примере 12.4. Как видите, даже такая простая операция, как присваивание значения переменной экземпляра, требует немалых хлопот, связанных с управлением памятью!

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

- (void) setTheData:            (NSMutableArray*)            value {

self->_theData = value;

}

Более того, когда объект прекращает свое существование, механизм ARC освобождает сохраняемые значения переменных экземпляра, а следовательно, избавляет от необходимости вызывать для этой цели метод dealloc! Тем не менее, если действует механизм ARC, метод dealloc приходится по-прежнему реализовывать по ряду других причин. Например, в этом методе уместно снимать объекты с регистрации на получение уведомлений (см. главу 11), но в то же время в нем не требуется вызывать метод release для любых переменных экземпляра, а также метод из суперкласса по ссылке'зирег. (Когда действует механизм ARC и вызывается метод dealloc, значения переменных экземпляра еще не освобождены, и поэтому к ним можно обращаться в этом методе.)

 

Что же делать, если в отсутствие вызова метода release, а при действующем механизме ARC его вызывать запрещено, требуется освободить значение пере-£ менной экземпляра? Ответ на этот вопрос довольно прост: установить пустое (nil) значение переменной экземпляра (возможно, с помощью метода установки). Если установить пустое значение этой переменной, механизм ARC по умолчанию освободит существующее ее значение автоматически.

 

В заключение, обсудим последствия применения механизма ARC для написания инициализатора, в котором устанавливаются значения переменных экземпляров объектов, как показано в примерах 12.5 и 12.6. Код для этих инициализаторов останется при применении механизма ARC таким же, как и без него, за исключением того, что не нужно да и нельзя выдавать команду retain. Следовательно, при действующем механизме ARC исходный код из примера 12.5 станет таким, как показано в примере 12.7.

 

 

Пример 12.7. Простой пример инициализатора, сохраняющего переменную экземпляра при действующем механизме ARC

- (id) initWithName: (NSString*) s (

self = [super init]; if (self) [

self->_name = s;

)

return self;

)

Исходный код инициализатора из примера 12.6 останется без изменения при действующем механизме ARC, как показано в примере 12.8. Тем не менее можно по-прежнему выдать команду сору, а механизму ARC известно, как управлять памятью объекта, возвращаемого из метода, смешанное написание имени которого начинается со слова сору или просто ограничивается им.

 

Пример 12Л. Простой пример инициализатора, копирующего переменную экземпляра при действующем механизме ARC

- (id) initWithName: (NSString*) s (

self = [super init]; if (self) (

self->_name = [s copy];

}

return self;


 

 

 

Добавить комментарий