Нужно ли выпускать временный объект из этого примера? - PullRequest
0 голосов
/ 18 марта 2010
-(IBAction) testTemp: (id) sender{
    id tempObj;
    tempObj = otherObject; //the otherObject will be released in dealloc method;
    [tempObj doSomething];
}

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

Ответы [ 2 ]

0 голосов
/ 23 июня 2011

tempObj не является объектом. tempObj является переменной. tempObj содержит указатель на объект, а назначение tempObj = otherObject заставляет otherObject содержать такой же указатель.

Объект является частью памяти. У каждого объекта есть счетчик, счетчик ссылок. [tempObj retain] добавляет 1 к счетчику ссылок, [tempObj release] вычитает 1 из счетчика ссылок. Это способ узнать, сколько мест вы используете свой объект. Когда счет достигает 0, объект объявляется мертвым. Никто больше не должен его использовать: часть памяти, где он жил, вероятно, будет использоваться другим объектом.

Таким образом, вы не захотите освобождать otherObject или tempObj, что даст тот же эффект (вычитая 1 из счетчика ссылок объекта). Если вы сделаете это, счетчик ссылок может достичь 0, а выпуск в методе dealloc может вызвать сбой.

0 голосов
/ 18 марта 2010

Нет, вам не нужно выпускать tempObj. Причина в том, что вы не сохраняете или не управляете памятью. Все, что tempObj - это указатель на otherObject, и вы просто используете его как псевдоним.

В коде есть какая-либо причина не использовать otherObject напрямую - если в реальном коде вам действительно нужно использовать tempObj, тогда вполне может потребоваться некоторое управление памятью.

...