2011-01-12 5 views
5

Estoy tratando de almacenar la cadena md5 como una variable de instancia de clase en lugar de la contraseña real. Tengo una función estática que devolverá una cadena md5 que estoy tratando de almacenar en una variable de instancia en lugar de la contraseña real.Objective-C Resultado de un método estático guardado en la variable de instancia de clase dando "EXC_BAD_ACCESS" cuando se usa

tengo el siguiente colocador para mi instancia de clase variables:

-(void)setPassword:(NSString *)newpass{ 
if(newpass != password){ 
    password = [utils md5HexDigest:newpass]; 
} 
} 

Esto pasará hacia atrás la cadena md5 correcta y guardarlo en la variable de contraseña en mi función init: [setPassword auto: pword] ;.

Si llamo a otro método de instancia y tratar de acceder self.password" voy a conseguir 'EXC_BAD_ACCESS'.

que entender que la memoria se está liberado, pero no tengo ninguna pista para asegurarse de que se mantiene.

me han tratado con init alloc autorelease sin suerte

Ésta es la función md5HexDigest recibiendo llamadas durante el init (que se encuentra en otra pregunta amablemente stackoverflow):.

+ (NSString*)md5HexDigest:(NSString*)input { 
    const char* str = [input UTF8String]; 
    unsigned char result[CC_MD5_DIGEST_LENGTH]; 
    CC_MD5(str, strlen(str), result); 

    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH*2]; 

    for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) 
    [ret appendFormat:@"%02x",result[i]]; 

    return ret; 
} 

Cualquier ayuda/sugerencia sería muy apreciada. Preferiría tener guardada la cadena md5 en memoria que la contraseña real que llama al md5 cada vez que necesitaba usar la contraseña.

Gracias de antemano.

+0

Se puede publicar el contenido de su interfaz? – Alex

+0

¿No es el problema de que el objeto que tienes ES se libera automáticamente? intente imprimir el recuento de retención en la consola para depurar [ret retainCount] [password retainCount] –

+3

No, no llame a retainCount. – pwc

Respuesta

3

Tanto David como pwc son correctos, pero faltan detalles importantes.

setPassword: debe copy el parámetro entrante. Esto asegurará de que tanto

  • es retain ed correctamente como las otras respuestas implican y también que
  • cadena el conjunto ya no es mutable.

decir algo como:

-(void)setPassword:(NSString *)newpass{ 
    [password release]; 
    password = [[utils md5HexDigest: newpass] copy]; 
} 
+0

Eres un compañero campeón effing. – Art

2

Su setter necesita retain el nuevo valor (el devuelto desde [utils md5HexDigest:newpass]). (Y no se olvide de release el antiguo valor también ...)

Además, la prueba if(newpass != password) no tiene ningún sentido: newpass es una contraseña real, pero password es el MD5.

+0

¡Bingo! Aprendí algo nuevo hoy, retení el truco. Gracias por tomar el condicional que tenía allí. ¡Gracias una tonelada! – KinGBin

2

El NSString devuelto por md5HexDigest se libera automáticamente (porque NSMutableString stringWithCapacity devuelve una cadena autorrellenada). Debe conservarlo en setPassword. De lo contrario, está siendo liberado por el grupo de autorrelease.

Cuestiones relacionadas