2011-11-10 8 views
5

Ya hice una pregunta similar, pero aún no puedo ver la ¿problema?Obj-, la variable de instancia utilizada mientras 'self' no está configurada para el resultado de '[(super o self) init ...]'

-(id)initWithKeyPadType: (int)value 
{ 
    [self setKeyPadType:value]; 
    self = [self init]; 
    if(self != nil) 
    { 
     //self.intKeyPadType = value; 

    } 
    return self; 
} 

- (id)init { 

    NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] 
                   autorelease]; 
    decimalSymbol = [formatter decimalSeparator]; 
.... 

La advertencia proviene de la línea anterior Instance variable used while 'self' is not set to the result of '[(super or self) init...]'

+1

si yo entiendo bien su código, que está utilizando una variable antes de llamar al [súper init] y esto puede ensuciar su asignación de memoria –

+0

No está llamando súper init en cualquier lugar – jrturton

Respuesta

4

Lo que está intentando hacer es técnicamente correcto, pero en algún momento debe invocar [super init]. Si el método init de su clase hace una gran cantidad de inicializaciones comunes que otros métodos initWith... utilizan, entonces ponga su [super init] allí. Además, siempre asegúrese de que la clase haya sido init 'd antes de intentar jugar con variables de instancia.

- (id) initWithKeyPadType: (int)value 
{ 
    self = [self init]; // invoke common initialisation 
    if(self != nil) 
    { 
     [self setKeyPadType:value]; 
    } 
    return self; 
} 

- (id) init 
{ 
    self = [super init]; // invoke NSObject initialisation (or whoever superclass is) 
    if (!self) return nil; 

    NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] 
                  autorelease]; 
    decimalSymbol = [formatter decimalSeparator]; 

    ... 
+0

¿Puede decir algo más sobre el riesgo real que la advertencia de GCC sirve para señalar? Asumiendo que la puesta a cero de la memoria de objeto ocurre en el tiempo de asignación (que creo que es correcto), parece que solo un @ivar o @protegido correría el riesgo de ser golpeado por el método "init" de una superclase, necesitando la advertencia. No puedo pensar por qué la advertencia sería útil para un ivar privado, excepto estilísticamente, pero esa no suele ser la preocupación del compilador. –

+0

@quixoto: + alloc hace cero memoria. No tengo ni idea de por qué es importante tampoco ... Puede tener algo que ver con el hecho de que una llamada a '[super init]' puede devolver 'nil', y si lo hace, todo' [sub init] ' los métodos también deberían devolver 'nil'. Aparte de eso, no tendría ni idea de por qué a GCC le importaría. – dreamlax

2

Los medios de advertencia lo que dice. Está asignando algo al decimalSymbol, que es una variable de instancia, pero en ese punto no hay instancia. Necesita un

self = [super init]; 

Al inicio de su método init. En algún momento el objeto tiene que ser creado, en algún momento esto tiene que volver a llamar a NSObject (a través de una cadena de superiniticios).

+3

Es un poco fuerte decir "no hay ejemplo." 'alloc' ya debería haber creado la instancia. El problema es que la instancia puede no haberse inicializado correctamente (ya que eso es lo que 'init' hace). – Chuck

+0

OK, cierto. ¿Ninguna instancia de "trabajo"? – jrturton

Cuestiones relacionadas