2009-02-11 15 views
7

estoy recibiendo un EXC_BAD_ACCESS (SIGBUS) en esta línea en mi proyecto iPhone (variable = nil!):es si (variable) lo mismo que si en Objective-C

if (timeoutTimer) [timeoutTimer invalidate]; 

Lo que me tiene perplejo es que no entiendo cómo esa línea podría colapsar, ya que la declaración if está destinada a verificar nulo. ¿Estoy entendiendo mal la forma en que funciona Objective-C, o los números de línea en las declaraciones de bloqueo alguna vez tienen la línea incorrecta en ellos?

Respuesta

16

El hecho de que una variable se establezca en un valor distinto de nil no significa que esté apuntando a un objeto válido. Por ejemplo:

id object = [[NSObject alloc] init]; 
[object release]; 
NSLog(@"%@", object); // Not nil, but a deallocated object, 
         // meaning a likely crash 

Su temporizador probablemente ya ha sido librado de (o, posiblemente, no se ha creado a todos?), Pero la variable no se establece en cero.

+0

tiene perfecto sentido, gracias. Me di cuenta de que no conservaba mi temporizador, que es algo que debería hacer. – rustyshelf

+0

Normalmente no es necesario retener un temporizador. Si crea un temporizador con initWithFireDate ..., no se libera automáticamente. Y una vez que se agrega un temporizador a un runloop (ya sea mediante addTimer o uno de los métodos ScheduTimer ...), el runloop lo retiene hasta que termina con él. – Chuck

+0

Lo creé con NSTimer scheduledTimerWithTimeInterval, que supongo que se lanzó automáticamente. ¿Se considera initWithFireDate mejor? – rustyshelf

-1

Ellos deben ser los mismos. Quizás el número de línea es de hecho incorrecto.

buscar otras posibles errores que cerca de su código y ver si encuentras algo.

6

Acabo de toparme con un problema similar, así que aquí hay otro ejemplo de lo que podría causar un error como el suyo.

En mi caso, me estaba poniendo el valor de un diccionario de esta manera:

NSString *text = [dict objectForKey:@"text"]; 

Más tarde, yo estaba usando la variable de la siguiente manera:

if (text) { 
    // do something with "text" 
} 

Esto dio lugar a un error de EXC_BAD_ACCESS y bloqueo del programa.

El problema era que mi diccionario usaba NSNull valores en los casos en que un objeto tenía un valor vacío (se había deserializado de JSON), ya que NSDictionary no puede contener valores nulos. Terminé trabajando alrededor de esto así:

NSString *text = [dict objectForKey:@"text"]; 
if ([[NSNull null] isEqual:text]) { 
    text = nil; 
} 
+1

Maldita sea, no me di cuenta de que NSDictionary no podía contener valores nulos. Gran respuesta. – Ben

Cuestiones relacionadas