Question

Cette question pourrait être hors de la base, mais voici le problème que je vais avoir:

Je suis en train d'exécuter un exemple de l'iPhone SDK, et je suis en cours d'exécution en une violation d'accès. J'ai retracé jusqu'à un comportement que je pense est suspect.

Voici ce que la classe ressemble à:

@interface TableViewCell : UITableViewCell {

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

Quand je mets un point d'arrêt dans

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

Et regardez « soi » dans le débogueur, il montre que _earthquakeDateLabel est « 0x12 », _earthquakeMagnitudeLabel est 0x1000, et les deux autres sont nuls. Si je tente d'attribuer à l'une des celles non nulles, je reçois une violation d'accès.

Je devine ce qui se passe est que ceux-ci ont des valeurs fausses en eux, et lorsque je tente de leur assigner, qui tente de décrémenter une référence sur la valeur faux et explose. Mais comme je le disais, je suis assez nouveau à l'objectif C, donc je peux être hors de la base.

Alors ma question est, est-il quelque chose de spécial sur l'initialisation de ces valeurs que je devrais faire? Ou un moyen d'attribuer à la valeur quand il a une valeur fausse en elle?


Quelques informations supplémentaires:

Donc, si je cède à nulle _earthquakeDateLabel et _earthquakeMagnitudeLabel dans initialize, qui résout le problème. Mais je ne comprends pas pourquoi l'objet est créé avec des valeurs dans ces domaines; Je les attends à être nul. L'objet est créé sur le tas:

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

Pas de solution correcte

Autres conseils

On dirait que le pointeur de self est faux. Les valeurs 0x12 et 0x1000 sont des constantes entières; ils ne sont certainement pas des pointeurs vers des adresses de mémoire valides. Le fait que vous voyez ces valeurs indique que quelque chose ne va pas, et d'essayer de les manipuler de la façon (lire ou les écrire) entraînera badness. Dans ce cas, vous obtenez une violation d'accès parce que vous essayez d'écrire à des adresses mémoire 0x12 et 0x1000, qui sont des adresses invalides.

Comment créez-vous les objets TableViewCell? Faites-vous TableViewCell *myCell = [[TableViewCell alloc] initWithFrame:...]? C'est la bonne façon.

Maintenant, je vais appeler mon débogueur psychique: my deviner est que vous oubliez de déclarer votre objet TableViewCell avec un pointeur, c.-à-vous déclarer comme TableViewCell myCell au lieu de TableViewCell *myCell ( noter la présence de l'astérisque). Cela va créer l'objet sur la pile à la place du tas, et par conséquent, il aura des ordures dans ses membres de données, au lieu de zéros. objets Objective-C, lorsqu'ils sont correctement attribués, auront tous leurs membres de données initialisées à 0 (ou NULL, nil ou false, en fonction du type de données) après un appel à alloc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top