Frage

Diese Frage könnte off base sein, aber hier ist das Problem, das ich habe:

Ich versuche, ein Beispiel aus dem iPhone SDK zu laufen, und ich laufe in eine Zugriffsverletzung auf. Ich habe einige Verhalten aufgespürt, die ich denke, ist verdächtig.

Hier ist, was die Klasse wie folgt aussieht:

@interface TableViewCell : UITableViewCell {

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

Wenn ich einen Haltepunkt in

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

Und Blick auf „Selbst“ im Debugger, zeigt es, dass _earthquakeDateLabel ist „0x12“, _earthquakeMagnitudeLabel 0x1000 ist, und die anderen beiden sind gleich Null. Wenn ich versuche, eine der beiden von Null verschiedenen diejenigen zu vergeben, ich eine Zugriffsverletzung erhalten.

Ich vermute, was passiert, ist, dass diese in ihnen falsche Werte haben, und wenn ich versuche, ihnen zu vergeben, die einen Verweis auf den falschen Wert zu verringern versucht und explodiert. Aber wie gesagt, ich bin ziemlich neu in Objective-C, damit ich weg von der Unterseite sein.

Also meine Frage ist, gibt es etwas Besonderes, diese Werte zu initialisieren, die ich tun sollte? Oder irgendeine Art und Weise auf den Wert zuweisen, wenn er einen falschen Wert in sich hat?


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 Bereichen geschaffen wird; Ich erwarte, dass sie null sein. Das Objekt wird auf dem Heap erstellt werden:

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

Keine korrekte Lösung

Andere Tipps

Es klingt wie der self Zeiger Schein ist. Die Werte 0x12 und 0x1000 ganzzahlige Konstanten sind; sie sind definitiv nicht Zeiger auf gültige Speicheradressen. Die Tatsache, dass Sie diese Werte sehen zeigt an, dass etwas falsch ist, und versuchen, sie in irgendeiner Weise zu manipulieren (Lesen oder Schreiben von ihnen) in Schlechtigkeit führen. In diesem Fall sind Sie eine Zugriffsverletzung bekommen, weil Sie versuchen, auf Speicheradressen 0x12 und 0x1000, das sind ungültige Adressen zu schreiben.

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 erraten ist, dass Sie vergessen Ihre TableViewCell Objekt mit einem Zeiger zu erklären, dh du bist es als TableViewCell myCell statt TableViewCell *myCell erklärt ( beachten Sie die Anwesenheit des Sternchens). Dadurch wird das Objekt auf dem Stapel anstelle dem Haufen, und als ein Ergebnis erzeugt, wird es Müll in seinen Datenelementen hat, anstelle von Nullen. Objective-C-Objekte, wenn sie richtig zugeordnet, werden alle ihre Datenelemente haben auf 0 initialisiert (oder NULL, nil oder false je nach Datentyp) nach dem erfolgreichen Aufruf alloc.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top