Tengo algo de código en mi aplicación que se ve algo como esto:¿Por qué Cocoa devuelve una cadena vacía ocasionalmente?
char *hash = (char*) sqlite3_column_text(get_bookmark, 0);
NSString* postHash = [NSString stringWithUTF8String:hash];
Esto funciona para mí cada vez; Nunca lo he visto no trabajo. La mayoría de mis usuarios no experimentan problemas (hasta donde yo sé). Sin embargo, encuentro que postHash
es una cadena vacía (@""
) para algunos usuarios algunas veces.
¿Alguien puede explicar por qué?
Un poco más de contexto/especulación:
Esto sólo parece ocurrir en los dispositivos con jailbreak. ¿Hay algo diferente acerca de ellos? Deduzco que usualmente hay menos memoria disponible. ¿Algo más que pueda contribuir aquí?
postHash
se utiliza en una celda de la tabla y de vez en cuando se ve a poblarse correctamente, así que estoy razonablemente seguro de que la llamada base de datos debe trabajo. De hecho, si la base de datos también tiene una cadena vacía, se debe a un fragmento de código muy similar, por lo que la pregunta se mantiene.
hash
sin duda regresa con un valor no nulo. Si forzo un NULL aquí, la aplicación falla. Del mismo modo, postHash
no es nil
ya que eso también bloquearía la aplicación (por la misma razón).
Estoy pensando que esto posiblemente esté relacionado con la memoria. Si el método intenta asignar demasiada memoria antes de llamar al -didReceiveMemoryWarning
, ¿qué ocurre? Sé que, en algún momento, Springboard expulsa la aplicación. Pero, ¿es posible que Cocoa devuelva aquí una cadena nula en lugar del valor esperado? He oído hablar de algunos informes que, por lo que puedo ver, solo pueden haber sido causados por una cadena vacía que estaba presente, donde algo más debería haber estado presente.
Cualquier otra especulación, teorías o ideas bienvenidas.
"¿Pero es posible que Cocoa devuelva aquí una cadena nula en lugar del valor esperado?" Una "cadena nula" sería NULL (la C-cadena) o nil (la NSString).Una cadena vacía es completamente diferente: es una cadena sin caracteres, mientras que NULL/nil no es una cadena en absoluto. –
Esa no es mi comprensión de lo que es una "cadena vacía". Cuando digo "cadena nula" más arriba, me refiero a "cadena vacía", es decir, @ "" en Objective-C o "" en C. Un valor nulo/NULL hace que la aplicación se cuelgue. –
"Nulo" significa 0. El carácter nulo es '\ 0'; es decir, 0. El puntero nulo es 0. No existe tal cosa como una "cadena nula" en C, porque si es nula, no es una cadena; es solo 0. –