¿Cómo se configura un valor no inicializado en Objective C?
-
06-09-2019 - |
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
.