Ненужный релиз в сеттере - PullRequest
       39

Ненужный релиз в сеттере

2 голосов
/ 20 февраля 2012

Существует множество примеров того, как мы должны это делать, например:

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

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

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

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

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

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

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

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

0 голосов
/ 20 февраля 2012

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

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

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

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