Principalmente, la razón es que Obj-C es en esencia C. Y para el caso de esta pregunta irrazonablemente cerca de la asamblea de metal desnudo. Sí hay sobrecarga es la secuencia de envío de resolución de mensajes, pero de nuevo como un lenguaje de tipo C que puede ser mitigado.
El camino como una simplificación bruta de cómo Garbage Collection / ARC (Automatic Reference Counting) está bien documentado. Sin embargo es un paso fácil visualizar un perro con correa mientras una persona esté interesada en ese perro tiene una referencia. Cuando nadie es «dueño» de ese perro. Entonces se programa para su desasignación.
En Java esta desasignación puede ocurrir en un momento indeterminado. Como es la naturaleza de Java. En la funcionalidad de Obj-C hay una macro de preprocesador que esencialmente envuelve cada puntero en ciclos de retención/liberación seguros para la memoria. Por lo que estos objetos serán expulsados de la memoria al final de la subrutina o muy pronto después.
En Java moderno esto es menos indeterminado sin embargo ni de lejos tan granular como en Obj-C. Además Obj-C sabe qué hacer con nil como entrada o como salida, lo que básicamente compensa muchas ineficiencias