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