2009-03-03 12 views
5

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.

+0

"¿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. –

+0

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. –

+0

"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. –

Respuesta

6

Sin embargo, me parece que postHash es una cadena vacía (@"") para algunos usuarios alguna vez.

¿Alguien puede explicar por qué?

Porque hash es una serie vacía (hash[0] == '\0').

+0

Estoy de acuerdo en que este sería el escenario más probable pero, como se señala en la pregunta, estoy bastante seguro de que no puede ser una cadena vacía. –

+2

No es "el escenario más probable"; es el * único * escenario. NULL te ofrece una excepción. Cualquier cadena no vacía obtiene una cadena no vacía. Solo una cadena vacía te da una cadena vacía. Prueba simple: NSLog la longitud en (strlen (hash)) y la longitud de salida ([postHash length]). –

4

Finalmente encontré la solución a esto. Voy a darle a Peter la respuesta aceptada, ya que él tiene razón, pero la razón por la que estaba obteniendo una cadena vacía es ... interesante.

La base de datos es poblada correctamente. La consulta también es correcta. La diferencia entre mi teléfono y mis usuarios es que tienen teléfonos rotos en la cárcel. Y aparentemente los iPhones rotos de la cárcel a veces usan una versión diferente de SQLite que la que se encuentra en las versiones de envío de iPhone OS.

El cambio en la versión expuso un error en mi código que causaba que uno de los parámetros se configurara incorrectamente y sqlite3_column_text para devolver una cadena vacía.

+3

Tiene que haber una forma de detectar un teléfono con jailbreak y luego rechazar el soporte de los usuarios. ¿Cuánto tiempo desperdiciaste por esto? No está encendido. – mxcl

+0

Difícil de estar seguro, pero creo que me llevó unas veinte horas, ¡y solo encontré la solución por accidente! Por otro lado, estaban pagando a los clientes. Aún así, he dicho que me reservo el derecho de no admitir teléfonos descompuestos. Escribí más sobre el blog de aplicaciones: http://www.yummyapp.com/2009/05/pirates-and-jail-break.html –

Cuestiones relacionadas