Pregunta

Esta pregunta podría ser fuera de la base, pero aquí está el problema que estoy teniendo:

Estoy intentando ejecutar un ejemplo del iPhone SDK, y yo estoy corriendo en una violación de acceso. He rastreado por un comportamiento que creo que es sospechoso.

Esto es lo que la clase se ve así:

@interface TableViewCell : UITableViewCell {

@private    
    UILabel *_earthquakeLocationLabel;
    UILabel *_earthquakeDateLabel;
    UILabel *_earthquakeMagnitudeLabel;
    UIImageView *_magnitudeImageView;
}

Cuando me puse un punto de interrupción en

- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier

Y mira "sí" en el depurador, muestra que _earthquakeDateLabel es "0x12", _earthquakeMagnitudeLabel es 0x1000, y los otros dos son iguales a cero. Si trato de asignar a cualquiera de los más distintos de cero, consigo una violación de acceso.

Estoy adivinando lo que está sucediendo es que estos tienen valores falsos en ellos, y cuando intento para asignar a ellos, que trata de disminuir un valor de referencia en falso y explota. Pero como ya he dicho, soy bastante nuevo en Objective C, así que puede ser fuera de la base.

Así que mi pregunta es, ¿hay algo especial acerca de la inicialización de estos valores que debo hacer? O cualquier forma de asignar al valor cuando tiene un valor falso en ella?


Algunas informaciones adicionales:

Así que si le asigno cero a _earthquakeDateLabel y _earthquakeMagnitudeLabel de inicialización, se soluciona el problema. Pero no entiendo por qué el objeto se crea con los valores en esos campos; Espero que sean nulas. El objeto está siendo creado en el montón:

TableViewCell *cell = [[[TableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];

No hay solución correcta

Otros consejos

Parece que el puntero self es falso. Los valores 0x12 y 0x1000 son constantes enteras; que definitivamente no estamos punteros a direcciones de memoria válidos. El hecho de que usted está viendo esos valores indica que algo está mal, y el intento de manipular de cualquier manera (leer o escribir en ellos) dará lugar a la maldad. En este caso, usted está recibiendo una violación de acceso, ya que está tratando de escribir en la memoria direcciones 0x12 y 0x1000, que son direcciones no válidas.

¿Cómo estás creando los objetos TableViewCell? ¿Estás haciendo TableViewCell *myCell = [[TableViewCell alloc] initWithFrame:...]? Esa es la forma correcta.

Ahora voy a invocar mi depurador psíquica: mi adivinar es que te estás olvidando de declarar su objeto TableViewCell con un puntero, es decir, que está declarada como tal en lugar de TableViewCell myCell TableViewCell *myCell ( en cuenta la presencia del asterisco). Esto creará el objeto en la pila en lugar del montón, y como resultado, tendrá la basura en sus miembros de datos, en lugar de ceros. objetos de Objective-C, cuando se asigna correctamente, tendrán todos sus miembros de datos inicializados a 0 (o NULL, nil o false, dependiendo del tipo de datos) tras una llamada correcta a alloc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top