2012-03-05 10 views
11

estoy recibiendo esta advertenciaContaje de referencia automático Problema: Asignación de objeto retenido a variable no segura_unretenido; objeto se dará a conocer después de la asignación

"Emisión de conteo automático de Referencia: Asignación de objeto retenido a la variable unsafe_unretained; objeto se dará a conocer después de la asignación"

Aquí está el código

.h

@interface myObject : NSObject 
{ 
} 

@property (assign) id progressEnergy; 

@end 

.m

@implementation myObject 

@synthesize progressEnergy; 

-(id)init 
{ 
    if ((self = [super init])) 
    { 
     progressEnergy = [[progress alloc] init]; //warning appear on this line 
    } 

    return self; 
} 

@end 

que ya han intentado

@property (assign) progress* progressEnergy; 

pero no hubo suerte

¿Puede usted por favor ayudarme a averiguar lo que está mal?

Respuesta

27

Cambio

@property (assign) progress* progressEnergy; 

a

@property (strong) progress* progressEnergy; 

por lo que su myObject retiene el objeto progress.

+0

gracias. Ese fue el problema :) – zeroonnet

9

Bueno, le advierte que está asignando un valor que está a punto de liberarse al final del alcance adjunto, que pasa a ser la siguiente línea. Así que esto es lo que su init se verá como después ARC añade en su magia:

-(id)init 
{ 
    if ((self = [super init])) 
    { 
     progressEnergy = [[progress alloc] init]; 
     [progressEnergy release]; ///< Release progressEnergy since we've hit the end of the scope we created it in 
    } 

    return self; 
} 

Así que su progressEnergy ahora es muy probable (aunque no necesariamente) para ser una referencia colgante.

cambiar la definición de la propiedad assign-strong:

@property (strong) progress* progressEnergy; 

En ese caso, su método init se verá así:

-(id)init 
{ 
    if ((self = [super init])) 
    { 
     progressEnergy = [[progress alloc] init]; 
     [progressEnergy retain]; ///< Since it's a strong property 
     [progressEnergy release]; ///< Release progressEnergy since we've hit the end of the scope we created it in 
    } 

    return self; 
} 

De hecho, llama objc_storeStrong en lugar de llamar retain como he mostrado, pero esencialmente se reduce a retain en este caso.

+0

gracias. Ese fue el problema :) – zeroonnet

Cuestiones relacionadas