objective developer apple iphone objective-c

iphone - developer - Devolviendo nil en el código init en Objective C



swift ios documentation (2)

Consulte Asignación e inicialización de objetos en la documentación.

Específicamente, si tiene un error en su inicializador, entonces se release y devuelve nil :

- init { self = [super init]; if (self) { if (... failed to initialize something in self ...) { [self release]; return nil; } } return self; }

Ahora, considera lo que sucede cuando llamas [super init] y devuelve nil . El patrón anterior ya se ha empleado, lo que era self se ha liberado y el retorno nil indica que la instancia se ha ido. No hay fugas y todos están felices.

Este también es un patrón válido (suponga que self es una instancia de MyClass ):

- init { self = [super init]; if (self) { ... normal initialization here ... } else { self = [MyClass genericInstanceWhenInitializationGoesBad]; self = [self retain]; } return self; }

Dado que se espera que init devuelva algo que se retained (por la implicación de estar encadenado desde +alloc ), entonces ese [self retain] , aunque parece ridículo, en realidad es correcto. El self = [self retain] solo está siendo más defensivo en caso de que MyClass anule para hacer algo extraño.

En el caso, si devolvemos nil en el método init, ¿qué sucede con el recuento de contadores y quién liberará este objeto?

Como entiendo tan pronto como llamamos alloc (que sucederá antes de init), la cuenta de retención se convertirá en 1. Ahora, se llama a init y digamos por alguna razón que no puede inicializar el objeto, por lo que devuelve nil.

Y parece que ahora tenemos el objeto con retención de conteo igual a 1 y nadie tiene referencia para llamar a la versión.

¿Deberíamos llamar a [autorrelease] en init para ese caso o hacer alguna otra cosa?


Normalmente llamas

self = [super init]; if (self == nil) { return nil; } // do some init job here return self;

No es su trabajo autorelease el auto, porque cuando lo tiene, ya es nulo, así que incluso si llama a [self autorelease]; no hace nada

Creo que el método init de NSObject tiene que lidiar con el objeto ya