Asignarse a sí mismo en Objective-C

Soy del mundo C ++ por lo que la noción de asignarthis me hace estremecer

this = new Object; // Gah!

Pero en Objective-C hay una palabra clave similar,self, por lo que esto es perfectamente aceptable:

self = [super init]; // wait, what?

Una gran cantidad de código Objective-C de muestra utiliza la línea anterior eninit rutinas Mis preguntas:

1) ¿Por qué la asignación aself tiene sentido (respuestas como "porque el lenguaje lo permite" no cuentan)

2) ¿Qué pasa si no asignoself en miinit ¿rutina? ¿Estoy poniendo mi caso en algún tipo de peligro?

3) Cuando lo siguienteif la declaración falla, qué significa y qué debo hacer para recuperarme de ella:

- (id) init
{
    self = [super init];

    if (self)
    {
        self.my_foo = 42;
    }

    return self;
}