2012-02-20 3 views
2

Есть много примеров сеттера, как мы должны сделать это, например:Ненужный релиз в инкубаторе

- (void)setFoo:(NSString *)newFoo 
{ 
    if (foo != newFoo) 
    { 
     [foo release];//?? 
     foo = [newFoo retain]; 
    } 
} 

Я понимаю, что нам нужно, чтобы освободить значение предыдущего, а затем назначить новую с сохранить, вот как документация говорит нам, что делать, но я не могу понять, что мы должны выпустить, если назначить foo = [newFoo сохранить]; будет делать foo только новое значение с помощью текущего счетчика newFoo, и если даже счетчик сохранения foo был 5 раньше, он станет newFoo + 1, или я что-то пропущу и пойму неправильно. Почему мы не можем просто сделать:

- (void)setFoo:(NSString *)newFoo 
{ 
    if (foo != newFoo) 
    { 
     foo = [newFoo retain]; 
    } 
} 

ответ

1

Objective-C работает с указателями (все указатели).

Когда вы выполняете retain или release, вы не делаете этого по ссылке/указателю (имя переменной), но на самом самом объекте.

Именно поэтому нам нужно освободить старый объект (потому что мы закончили с ним) и направить нашу переменную на новую (затем увеличьте его счетчик retain, чтобы он не удалялся чем-то другим) ,

Надежда, что имеет смысл

+0

oh 10x, я понимаю. На самом деле нам нужно выпустить не var, а ячейку памяти –

0

Foo является указателем (адрес памяти) указывает на объект NSString, хранящегося в памяти. Когда эта функция setter запускается, в памяти есть два объекта NSString: один из них указывается и удерживается foo, а другой передается в качестве аргумента. Каждый объект имеет свой собственный счет.

foo == newFoo указывает указателю прекратить указывать на старый NSString и начать указывать на новый.

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

+0

10x, звучит хорошо, сбрасывать мне голову –

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