2009-05-30 4 views
0

Cette question peut être hors base, mais voici le problème que j'ai:Comment définir une valeur non initialisée dans Objective C?

Je suis en train d'exécuter un exemple de l'iPhone SDK, et je cours dans une violation d'accès. J'ai tracé un comportement que je trouve 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 zéro. Si j'essaie d'assigner à l'un des non-zéro, je reçois une violation d'accès. Je suppose que ce qui se passe, c'est qu'ils ont des valeurs fausses, et quand j'essaie de les assigner, cela essaie de décrémenter une référence sur la valeur bidon et de gonfler. Mais comme je l'ai dit, je suis relativement nouveau à l'objectif C, donc je ne suis peut-être pas à la base. Donc, ma question est: Y a-t-il quelque chose de spécial à propos de l'initialisation de ces valeurs que je devrais faire? Ou n'importe quelle manière d'assigner à la valeur quand elle a une valeur bidon dedans?


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 champs; Je m'attends à ce qu'ils soient nuls. L'objet est créé sur le tas:

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

Répondre

1

Il semble que le pointeur self est faux. Les valeurs 0x12 et 0x1000 sont des constantes entières; ils ne sont certainement pas des pointeurs vers des adresses mémoire valides. Le fait que vous voyez ces valeurs indique que quelque chose ne va pas, et tenter de les manipuler d'une manière ou d'une autre (en les lisant ou en les écrivant) se traduira par de la méchanceté. Dans ce cas, vous obtenez une violation d'accès car vous essayez d'écrire dans les adresses de mémoire 0x12 et 0x1000, qui sont des adresses non valides.

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: mon conjecture est que vous oubliez de déclarer votre TableViewCell objet avec un pointeur, c.-à-vous déclarer comme TableViewCell myCell au lieu de TableViewCell *myCell (noter la présence de l'astérisque). Cela créera l'objet sur la pile au lieu du tas, et par conséquent, il aura des déchets dans ses membres de données, au lieu de zéros. Les objets Objective-C, lorsqu'ils sont correctement alloués, auront tous leurs membres de données initialisés à 0 (ou NULL, nil ou false, selon le type de données) après un appel réussi à alloc.