TempObj n'est pas un objet. tempObj est une variable. tempObj contient un pointeur vers l'objet et l'affectation tempObj = otherObject fait que otherObject contient le même pointeur.
L'objet est une partie de la mémoire. Chaque objet possède un compteur, le compteur de référence. [tempObj retain] ajoute 1 au compteur de référence, [tempObj release] soustrait 1 au compteur de référence. C'est un moyen de savoir dans combien d'endroits vous utilisez votre objet. Lorsque le compteur atteint 0, l'objet est déclaré mort. Personne ne devrait plus l'utiliser : la portion de mémoire où il vivait sera probablement utilisée par un autre objet.
Vous ne voudrez donc pas libérer otherObject ou tempObj, qui obtiendront le même effet (soustraire 1 au nombre de références de l'objet). Si vous faites cela, le nombre de références pourrait atteindre 0 et le release dans la méthode dealloc causera probablement un crash.