2010-11-06 3 views
0

Я понял, что после того, как вы выпустили объект, вы не должны его использовать, так как это вызовет ошибку, поскольку оно больше не в памяти.Освобождение объекта, но все еще способное его использовать

Но чтение через this Apple guide, я нашел этот код, а также видел его раньше, но я бы просто переместил [object release] в конец моего кода, чтобы избежать ошибки. Но кажется, что это принято и работает. Итак, почему это работает? Как он может поддерживать настройку переменных до dateAttribute после того, как он будет выпущен?

(линия 3 является один в вопросе):

NSMutableArray *runProperties = [NSMutableArray array]; 

NSAttributeDescription *dateAttribute = [[NSAttributeDescription alloc] init]; 
[runProperties addObject:dateAttribute]; 
[dateAttribute release]; 
[dateAttribute setName:@"date"]; 
[dateAttribute setAttributeType:NSDateAttributeType]; 
[dateAttribute setOptional:NO]; 

Понял здесь: Creating a managed object model in code

ответ

2

Есть несколько моментов, которые мы должны обсудить.

  1. release делает не всегда делают объект освобождаться. Объект будет освобожден только при «последнем» выпуске, т. Е. Когда отсчет удержания будет равен нулю.
  2. Несмотря на это, по-прежнему сохраняется право на то, что вы не должны использовать объект после его выпуска, поскольку он может быть возможно, что он может быть освобожден уже.
  3. NSMutableArray сохранит объект до его удаления из массива или сам массив.

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

+0

Отредактировано для удаления ссылки на 'keepCount'. Концепция dropping to 0 действительна, но 'keepCount' никогда не может вернуть 0 по очевидным причинам. – bbum

+0

Изменяет ли компилятор 'dateAttribute' на адрес памяти? Потому что для меня, даже если массив делает другое 'сохранение' на объекте, это все еще два разных указателя (один называется dateAttribute, другой называется runProperties [0]). Итак, если я выпущу 'dateAttribute', я думаю, что я освобождаю указатель на этот объект, и единственным способом использования этого объекта будет' [[runProperties objectAtIndex: 0] setSomething: blah]; ' – elcool

+0

Нет, атрибут dateAttribute указывает на тот же адрес после выпуска, и независимо от того, что освобождение вызывает освобождение или нет. – tia

1

Технически, это плохой стиль, однако он работает.

NSMutableArray (runProperties addObject) вызывает retain в атрибуте dateAttribute. Поэтому вызов release не уничтожает атрибут dateAttribute (есть еще одна ссылка).

Для удобства чтения и рефакторинга я также позвонил бы releaseпоследнему.

Смежные вопросы