Domanda

Questa domanda potrebbe essere fuori dalla base, ma ecco il problema che sto avendo:

Sto cercando di eseguire un esempio da iPhone SDK, e sto correndo in una violazione di accesso. Ho rintracciato giù alcuni comportamenti che secondo me è sospetto.

Ecco ciò che la classe appare come:

@interface TableViewCell : UITableViewCell {

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

Quando ho creato un punto di interruzione

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

E guardate "sé" nel debugger, mostra che _earthquakeDateLabel è "0x12", _earthquakeMagnitudeLabel è 0x1000, e gli altri due sono pari a zero. Se provo ad assegnare a uno di quelli diversi da zero, ottengo una violazione di accesso.

Sto cercando di indovinare quello che sta succedendo è che questi hanno valori falsi in loro, e quando provo ad assegnare a loro, che cerca di diminuire un punto di riferimento sul valore fasullo e fa saltare in aria. Ma come ho detto, io sono abbastanza nuovo per Objective C, così che io possa essere fuori base.

Quindi la mia domanda è, c'è qualcosa di speciale in inizializzare questi valori che dovrei fare? O qualsiasi modo per assegnare al valore quando si ha un valore fasullo in esso?


Alcune informazioni aggiuntive:

Quindi, se assegno zero a _earthquakeDateLabel e _earthquakeMagnitudeLabel in inizializzazione, che risolve il problema. Ma non capisco il motivo per cui l'oggetto viene creato con i valori in questi campi; Mi aspetto che siano pari a zero. L'oggetto viene creato sul mucchio:

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

Nessuna soluzione corretta

Altri suggerimenti

Sembra che il puntatore self è fasullo. I valori 0x12 e 0x1000 sono costanti intere; sono sicuramente NON puntatori a indirizzi di memoria validi. Il fatto che si sta vedendo quei valori indica che qualcosa non va, e il tentativo di manipolare in qualsiasi modo (lettura o scrittura) si tradurrà in cattiveria. In questo caso, che stai ricevendo una violazione di accesso perché si sta cercando di scrivere indirizzi di memoria 0x12 e 0x1000, che sono indirizzi non validi.

Come stai creando gli oggetti TableViewCell? Stai facendo TableViewCell *myCell = [[TableViewCell alloc] initWithFrame:...]? Questo è il modo corretto.

Ora ho intenzione di invocare il mio debugger psichica: il mio indovinate è che si sta dimenticando di dichiarare il vostro oggetto TableViewCell con un puntatore, cioè si sta dichiarando come TableViewCell myCell invece di TableViewCell *myCell ( notare la presenza della asterisco). Questo creerà l'oggetto sulla pila invece del mucchio, e come risultato, si avrà spazzatura nelle sue componenti di dati, invece di zeri. oggetti Objective-C, se correttamente allocato, avranno tutti i loro membri dati inizializzati a 0 (o NULL, nil o false, a seconda del tipo di dati) dopo una chiamata riuscita al alloc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top