2012-02-25 29 views
5

que desarrollaron una aplicación para iOS que tenía una:Error NSError *; vs NSError * error = nil;

NSError *error; 

en lugar de:

NSError *error = nil; 

funcionó bien mientras yo estaba en la depuración en el simulador y la depuración en el dispositivo mientras está conectado. En el momento en que lo archivé y lo envié a TestFlight para implementarlo, comencé a recibir Señales desconocidas apareciendo errores en el registro de fallos.

¿Por qué sucede esto?

Respuesta

7

Esto ocurre porque tiene un puntero no inicializado. No se cuelga mientras tengas suerte, pero el uso de tales punteros es undefined behavior.

+0

@ daSn0wie En caso de duda, registre la dirección de la variable no inicializada justo después de haberla declarado. 'NSLog (@" error:% p ", error);' – bneely

3

Para aclarar el dasblinkenlights respuesta, esto es declarar una variable:

NSError *error; 

... y esto es declarar y asignar una variable

NSError *error = nil; 

Cuando se utiliza la primera forma y tratar para acceder a él sin configurarlo nunca, el valor al que apunta es conocido como "basura". Es un puntero a alguna otra pila de memoria, y acceder a ella casi siempre hará que la aplicación se cuelgue. Por lo tanto, siempre es mejor práctica asignar un valor a su variable como arriba, o poco después.

+1

No se debe acceder a una varilla 'NSError' a menos que haya un error, generalmente mediante el método que devuelve un estado de error. Las API no garantizan el valor del error var si no hay error. Uno no puede confiar en eso solo porque la var se estableció en cero y cambió por la llamada que hubo un error. Por lo tanto, establecerlo en cero no es perjudicial ni bueno. – zaph

+0

Realmente depende de qué API esté usando. – coneybeare

+1

De los documentos de Apple en 'NSError':" En general, un método debe señalar una condición de error, por ejemplo, devolviendo NO o nil en lugar de la simple presencia de un objeto de error ". Confiar en un código de error devuelto siempre será seguro, confiar en un objeto 'NSError' puede o no ser seguro. Es una elección. – zaph

Cuestiones relacionadas