Objective-c: Preguntas acerca de self = [super init]


He visto self = [super init] en init métodos. No entiendo por qué. No [super init] retorno de la superclase? Y si el punto self = [super init], no estamos consiguiendo self = superclass?

He aquí un ejemplo de fragmento de código

- (id)init 
{
    if (self = [super init]) {
        creationDate = [[NSDate alloc] init];
    }
    return self;
}

Espero que alguien pueda aclarar esto para mí. Gracias.

InformationsquelleAutor CodeHelp | 2013-09-09

8 Kommentare

  1. 45

    Suponiendo que MyClass es una subclase de BaseClass, ocurre lo siguiente cuando
    llame

    MyClass *mc = [[MyClass alloc] init];
    1. [MyClass alloc] asigna una instancia de MyClass.
    2. La init mensaje es enviado a esta instancia para completar el proceso de inicialización.

      En ese método, self (que es un argumento oculto a todos Objective-C métodos) es
      la cantidad asignada a cada instancia desde el paso 1.
    3. [super init] llama a la superclase aplicación de init con el mismo (oculto)
      self argumento.
      (Este podría ser el punto en el que debe entenderse erróneamente.)
    4. En el init método de BaseClass, self es todavía el misma instancia de MyClass.
      Esta superclase método init puede ahora

      • De la base de inicialización de self y volver self, o
      • Descartar self y asignar/inicializar y devolver un objeto diferente.
    5. De vuelta en el init método de MyClass: self = [super init] ahora

      • La MyClass objeto que le fue asignada en el paso 1, o
      • Algo diferente. (Es por eso que uno debe comprobar y utilizar este valor de retorno.)
    6. La inicialización se ha completado (utilizando el self devuelto por la superclase init).

    Así que, si he entendido bien su pregunta, el punto principal es que

    [super init]

    llama a la implementación de la superclase de init con el self argumento,
    que es un MyClass objeto, no un BaseClass objeto.

    • En el paso 4, la «diferentes» objeto de ser otra cosa que nil?
  2. 6

    Como usted tiene Pregunta self = [super init] en la Condición del if sugieren un significado específico.

    Primero de todos [super init] da la inicialización de la superclase de la clase existente que está en uso actualmente. El uso de [super init] da la super clase de inicialización, que muestra que el objeto de la clase.

    Ahora, cuando se utiliza self = [super init] eso significa que usted está asignando la clase para el auto para la posterior utilización de la misma clase.

    Y al final pones en si la condición como if(self = [super init]) esto significa que usted es la comprobación de si el objeto de la clase existir de no prevenir el mal comportamiento de la aplicación.

    Creo que está claro ahora!!!

  3. 3

    @MartinR tiene una muy buena respuesta. Pero, ¿alguna vez se ha preguntado por qué «[super init] llama la implementación de la superclase de init con el mismo (oculto) auto argumento. (Este podría ser el punto en el que debe entenderse erróneamente.)» trabaja en su 3er punto ?

    Aquí está el extracto de Big Nerd Ranch guía 3ª edición, capítulo 2 Objetivo C que aclara este punto

    «¿Cómo funciona el super trabajo? Por lo general, cuando usted envía un mensaje a un objeto,
    la búsqueda de un método con ese nombre comienza en la clase del objeto. Si
    no existe tal método, la búsqueda continúa en la superclase de la
    objeto. La búsqueda continuará hasta la jerarquía de herencia hasta un
    método adecuado se encuentra. (Si es que llega a la parte superior de la jerarquía y
    ningún método es encontrado, se produce una excepción.)»

    «Cuando usted envía un mensaje a super, usted está enviando un mensaje a auto,
    pero la búsqueda por el método de salta la clase del objeto y comienza a
    el superclase

    Este código muestra cómo iOS en tiempo de ejecución realiza esta tarea

    objc_msgSendSuper(self, @selector(init));
  4. 2

    Self = [super init];

    De acuerdo a JAVA, este significa un puntero a la instancia de sí mismo, de modo objeto propio mensaje.

    Mismo meainng de Auto aquí en objective C,

    De acuerdo a JAVA, Super significa que permite el acceso a la base o de los padres de la clase

    Mismo meainng de Super aquí en objective C,

    Ahora init instancia para completar el proceso de inicialización.

  5. 1

    Yo creo que init ing todos los supers variables, etc, luego de llegar a init extendida clases de variables antes de la devolución.

  6. 1

    [super init] es el mismo que [auto superclass_variant_of_init]

    Si quieres enviar un mensaje a la superclase, existe otro enfoque (sin utilizar la biblioteca de tiempo de ejecución):

    [[self superclass] init];
  7. 1

    De La Documentación de Apple:

    Porque un init… método puede devolver nil o un objeto que no sea el explícitamente asignado, es peligroso utilizar la instancia devuelta por alloc o allocWithZone: en lugar de que el devuelto por el inicializador. Considere el siguiente código:

    id myObject = [MyClass alloc];
    [myObject init];
    [myObject doSomething];

    El método init en el ejemplo anterior podría haber devuelve nil o podría haber sustituido un objeto diferente. Debido a que usted puede enviar un mensaje a nil sin levantar una excepción, no pasaría nada en el caso anterior, excepto que (tal vez) una depuración de dolor de cabeza. Pero siempre se debe confiar en el inicializado ejemplo, en lugar de la «prima» justo asignado uno. Por lo tanto, usted debe nido de la asignación de mensaje dentro del mensaje de inicialización y prueba el objeto devuelto desde el inicializador antes de continuar.

    id myObject = [[MyClass alloc] init];
    if ( myObject ) {
        [myObject doSomething];
    } else {
        //error recovery... 
    }

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea