2009-07-31 2 views
0

Я начинаю понимать управление памятью лучше в объективе-c, но я чего-то не понимаю. Это свойство декларация:Управление памятью со свойствами

@property (nonatomic, retain)UILabel *myLabel; 

и это его невидимый синтезируются сеттер (я думаю):

- (void)setMyLabel:(UILabel *)newValue { 
    if(myLabel != newValue) { 
     [myLabel release]; 
     myLabel = [newValue retain]; 
    } 
} 

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

UILabel *tempLabel = [[UILabel alloc] init]; 
self.myLabel = tempLabel; 
[tempLabel release]; 

Я не совсем уверен, что там происходит, когда он не выпускает ничего, но говорят, что собственность уже имеет значение, и мы устанавливаем его. В сеттер, сначала он освобождается. Разве это не значит, что оно исчезает? Если его счетчик ссылок равен единице, а затем в отключенном сеттере, как он остается вокруг, чтобы быть установленным на оставшееся новое значение?

Спасибо!

ответ

6

Я думаю, вы путаете объекты и ссылки. Свойство - это ссылка на объект, а не на объект. Когда вы устанавливаете или удаляете свойство, он отправляет сохраненные и освобождаемые объекты объектам, на которые указывает, но сама ссылка является частью объекта, в котором находится свойство (в данном случае self).

Возможно, было полезно ознакомиться с такими вещами, как pointers и lvalues.

+0

Спасибо, что имеет смысл. – mk12

-2

Я тоже относительно новичок в Objective-C, но хотел бы попытаться ответить на это, чтобы подтвердить мое понимание.

сказать, что я установил свое свойство в первый раз, его еще не выделено, поэтому его счетчик ссылок равен 0, правильно?

Да, сохранить отсчет 0.

В инкубаторе, первым он освобождается. Разве это не значит, что оно исчезает?

Он вычитает 1 из суммы удержания myLabel. Если значение сохранения myLabel достигает 0, данные или объект, на которые указывает указатель myLabel, будут освобождены из памяти.

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

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

+0

Технически, лучше не думать об абсолютном удержании, а вместо этого думать о том, есть ли у вас доля собственности в объекте. Если счет сохранения объекта достигает 0, он освобождается. Автореализованные объекты (которые, возможно, сохраняют счет 1 и более поздних версий, равны 0), отличаются от того, что вы объясняете в своей первой точке. И, как указывает Луис, у иваров (переменных/ссылок) нет удержаний - объекты. –

+0

Вы должны разместить это как комментарий к вопросу или как новый вопрос. – Quentamia

0

Начальное значение myLabel равно нулю , поэтому ваше первое присвоение собственности, то есть

self.myLabel = tempLabel; 

освободит ноль, т.е. [nil release].В Objective C отправка сообщения в nil является no-op, поэтому это ничего не сделает.

Аналогично, в методе dealloc, вы должны иметь:

которая выпустит MyLabel если свойство когда-либо присваивалось, балансируя на [новое_значение сохранить] в инкубаторе. Если свойство никогда не было назначено, оно все равно будет равно нулю, и снова [nil release] будет no-op.

Прочитайте memory management rules для получения точных правил о том, когда вам нужно сохранить/освободить объекты.

Объект «исчезнет» (т.е. будет освобожден), когда все владения на нем будут отклонены. То есть, когда (или вскоре после этого) все вызовы alloc/copy/new были сбалансированы с помощью вызовов release/автоответчика.

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