Pregunta

En mi rutina de dibujo para una costumbre UITableViewCell, estaba utilizando la siguiente sin ningún problema:

CGContextRef context = UIGraphicsGetCurrentContext();   
UIColor* backgroundColor = [UIColor colorForHex:@"FFFEFF"];
[backgroundColor set];
CGContextFillRect(context, rect);

Por supuesto, esto es bastante estándar a excepción de mi interfaz en el objeto UIColor para colorForHex el que toma una cadena y se rompe esto abajo en valores RGB de 0-255 y devuelve un objeto UIColor con los siguientes (a se cambia automáticamente a 1.0f ):

return [UIColor colorWithRed:((float) r/255.0f) green:((float) g/255.0f) blue:((float) b/255.0f) alpha:a];

Ahora bien, esto funciona bien, pero trató de mejorar este y centralizar la creación el color (y la fuente) para tratar de acelerar la rutina sorteo tanto como sea posible. Aquí es donde tengo el problema.

I crear un protocolo usando:

@protocol ItemListTableViewCellDelegate
-(UIFont*) fontForId:(int) fontID;
-(UIColor*) colorForId:(int) colorID;
@end

El controlador implementa este protocolo e implementa el método colorForId como:

-(UIColor*) colorForId:(int) colorID {
    UIColor* requestedColor = nil;
    switch (colorID) {
        case BACKGROUND_COLOR_ID:
        {
            requestedColor = backgroundColor;
        }
            break;
    }
    return requestedColor;
}

donde se crea backgroundColor como miembro del controlador como un UIColor * en el método initWithStyle del controlador. Esto se llama y el backgroundColor se está creando.

La celda tiene un miembro de NSObject<ItemListTableViewCellDelegate>* cellDelegate que se inicializa con el controlador de modo que la célula puede llamar

UIColor* backgroundColor = [cellDelegate colorForId:BACKGROUND_COLOR_ID]; 

que aparece para devolver el puntero a la correcta UIColor en el controlador, pero cuando 'conjunto' se llama en este color en el método draw celular, entonces la célula lanza un error de acceso BAD y no puedo entender por qué.

Cualquier punteros en la dirección correcta?

¿Fue útil?

Solución

En cualquier error EXC_BAD_ACCESS, generalmente se intenta enviar un mensaje a un objeto lanzado. La MEJOR manera de seguir estas abajo es usar NSZombieEnabled .

Esto funciona en realidad nunca la liberación de un objeto, pero envolviéndolo como un "zombie" y el establecimiento de una bandera en su interior que dice que normalmente habría sido puesto en libertad. De esta manera, si se intenta acceder de nuevo, todavía sabía lo que era antes de realizar el error, y con este poco de información, normalmente se puede dar marcha atrás para ver cuál era el problema.

Es de especial utilidad en las discusiones de fondo cuando el depurador veces dados a cabo en cualquier información útil.

muy importante señalar sin embargo, es que se necesita un 100% asegurarse de que esto es sólo en su código de depuración y no su código de distribución. Debido a que nada se libere, su aplicación va a gotear y gotear y gotear. Para recordarle que haga esto, puse este registro en mi AppDelegate:

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
  NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top