En premier lieu, la raison est que Obj-C est essentiellement du C. Et dans le cas de cette question, il est très proche de l'assemblage métal nu. Oui il y a un overhead est la séquence de distribution de résolution de message mais encore une fois comme un langage de type C qui peut être atténué.
La façon comme une simplification grossière de la façon dont Garbage Collection/ARC (Automatic Reference Counting) est bien documenté. Cependant c'est une étape facile de visualiser un chien en laisse tant qu'une personne est intéressée par ce chien il a une référence. Lorsque personne ne "possède" ce chien. Alors il est programmé pour la désaffectation.
En Java cette désaffectation peut se produire à un moment indéterminé. Comme c'est la nature de Java. Dans la fonctionnalité Obj-C, il existe une macro de préprocesseur qui enveloppe essentiellement chaque pointeur dans des cycles de rétention/libération sûrs pour la mémoire. Par lequel ces objets seront vidés de la mémoire à la fin du sous-programme ou très peu de temps après.
Dans le Java moderne, cela est moins indéterminé cependant nulle part aussi granulaire que dans Obj-C. En outre Obj-C sait quoi faire avec nil comme entrée ou comme sortie, ce qui compense fondamentalement de nombreuses inefficacités
.