2009-05-30 11 views
0

Diese Frage könnte von der Basis abweichen, aber hier ist das Problem, das ich habe:Wie setze ich einen nicht initialisierten Wert in Objective C?

Ich versuche, ein Beispiel aus dem iPhone SDK auszuführen, und ich bin in eine Zugriffsverletzung laufen. Ich habe ein Verhalten verfolgt, von dem ich glaube, dass es verdächtig ist.

Hier ist, was die Klasse wie folgt aussieht:

@interface TableViewCell : UITableViewCell { 

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

Als ich

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

in

einen Haltepunkt setzen und auf "Selbst" Blick in den Debugger, zeigt es, dass _earthquakeDateLabel ist "0x12", _earthquakeMagnitudeLabel ist 0x1000 und die anderen beiden sind Null. Wenn ich versuche, einer der Nicht-Null-Variablen zuzuweisen, erhalte ich eine Zugriffsverletzung.

Ich vermute, was passiert ist, dass diese falschen Werte in ihnen haben, und wenn ich versuche, ihnen zuzuordnen, versucht, eine Referenz auf den falschen Wert zu dekrementieren und explodiert. Aber wie gesagt, ich bin ziemlich neu in Objective C, also bin ich vielleicht nicht auf der Base.

Also meine Frage ist, gibt es etwas Besonderes über die Initialisierung dieser Werte, die ich tun sollte? Oder irgendeine Art, dem Wert zuzuweisen, wenn es einen falschen Wert enthält?


Einige zusätzliche Informationen:

Also, wenn ich Null bis _earthquakeDateLabel und _earthquakeMagnitudeLabel in initialize zuweisen, das das Problem behebt. Aber ich verstehe nicht, warum das Objekt mit Werten in diesen Feldern erstellt wird; Ich erwarte, dass sie null sind. Das Objekt wird auf dem Heap erstellt:

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

Antwort

1

Es klingt wie der self Zeiger ist gefälscht. Die Werte 0x12 und 0x1000 sind ganzzahlige Konstanten; Sie sind definitiv keine Zeiger auf gültige Speicheradressen. Die Tatsache, dass Sie diese Werte sehen, weist darauf hin, dass etwas nicht stimmt, und der Versuch, sie in irgendeiner Weise zu manipulieren (Lesen oder Schreiben), führt zu Schlechtigkeit. In diesem Fall erhalten Sie eine Zugriffsverletzung, weil Sie versuchen, auf Speicheradressen 0x12 und 0x1000 zu schreiben, die ungültige Adressen sind.

Wie erstellen Sie die TableViewCell Objekte? Machst du TableViewCell *myCell = [[TableViewCell alloc] initWithFrame:...]? Das ist der richtige Weg.

Jetzt werde ich meine psychischen Debugger aufzurufen: meine Vermutung ist, dass Sie vergessen Ihre TableViewCell Objekt mit einem Zeiger zu erklären, dh Sie es als TableViewCell myCell statt TableViewCell *myCell erklären (man beachte die Anwesenheit von das Sternchen). Dadurch wird das Objekt auf dem Stapel anstelle des Heapspeichers erstellt, und als Ergebnis wird in den Datenelementen anstelle von Nullen ein Datenmüll angezeigt. Objective-C-Objekte werden bei ordnungsgemäßer Zuordnung alle Datenelemente nach einem erfolgreichen Aufruf von alloc auf 0 initialisiert (oder , nil oder false, abhängig vom Datentyp).

Verwandte Themen