2010-12-23 10 views
0

Schwerwiegendes Problem hier ... Ich erhalte ECX_BAD_ACCESS, wenn ich NSLog eine Instanzvariable meines benutzerdefinierten Objekts versuche. Die folgende Funktion wird in ViewController aufgerufen: payload enthält String-Daten, die aus einer URL abgerufen werden.Instanzvariablen nicht zugänglich

- (void) initVcardWithData:(NSString *)payload { 
    NSLog(@"1. initVcardWithData"); 
    aVCard = [[vcardItem alloc] initWithPayload:payload]; 
    VCardViewController *aVCardViewController = [[VCardViewController alloc] initWithVCard:aVCard]; 
    [self presentModalViewController:aVCardViewController animated:YES]; 
    [aVCard release]; 
} 

So weit so gut. Die initWithWithVCard Funktion wird wie folgt, theVCard und theVCardN in @implementation definiert sind und auch als @property gesetzt (nonatomic behalten) in (.h) .:

-(id)initWithVCard:(vcardItem *)aVCard { 
    if(self = [super init]) { 
     theVCard = [aVCard retain]; 
     theVCardN = [theVCard.PersonName retain]; 
    } 

    NSLog(@"---- vCardViewController :: initWithVcard :: FirstName: %@", theVCard.PersonName.FirstName); 
    return self; 
} 

Wenn ich das theVCardN Objekt in meinem Viewcontroller zugreifen aVCardViewController innerhalb ViewDidLoad alles funktioniert wie ein Charme. Ich habe einige Etiketten mit Daten von diesem Objekt gesetzt.

Wenn ich dann versuchen, auf die Instanzvariablen von theVCardN innerhalb einer Funktion zuzugreifen, die von einer IBAction aufgerufen wird, die mit einer Schaltfläche in View verbunden ist, erhalte ich einen Fehler EXC_BAD_ACCESS an der Debugger-Konsole. Die Funktion, die Daten aus den Instanzvariablen zu ziehen versucht, ist wie folgt:

-(IBAction)addressbookButtonTapped { 
NSLog(@"RETAIN COUNT FOR theVCard: %i", [theVCard retainCount]); 
NSLog(@"RETAIN COUNT FOR theVCardN: %i", [theVCardN retainCount]); 
NSLog(@"Save to Adressbook: %@", theVCardN.FirstName); 



//[self dismissModalViewControllerAnimated:YES]; 
} 

Die RetainCounter für theVCardN Recht vor NSLog gibt „1“ zu nennen. Die NSLog-Zeile gibt dann EXC_BAD_ACCESS in der Debugger-Konsole zurück.

Irgendeine Idee?

+0

Meine Vermutung ist, dass die vCard nicht richtig eingerichtet ist. – Eiko

+0

bevor NSLog ausführen, geben Sie den Wert in gdb aus. Sie werden erfahren, was das eigentliche Problem ist. Setzen Sie den Cursor im Debug-Modus auf diese Zeile. Klicken Sie mit der linken Maustaste auf das gelbe Etikett, das angezeigt wird, und klicken Sie auf Beschreibung drucken. Sie können sehen, was der Wert ist. – Raxit

+0

Die Ausgabe ist: 'Druckbeschreibung desVCardN.FirstName:' ​​nichts mehr – MadMaxAPP

Antwort

1

Rufen Sie nicht -RetainCount. Absolute Retain-Zählungen sind nutzlos.

retainCount gibt die absolute Retain-Anzahl eines Objekts zurück. Der tatsächliche Wert wird ein Implementierungsdetail sein, das sehr oft völlig außerhalb Ihrer Kontrolle liegt, da die Systemframeworks intern eine beliebige Anzahl von Dingen ausführen können, um zu bewirken, dass die Retain-Anzahl auf eine Weise geändert wird, die Sie nicht erwarten.

Es ist nutzlos für das Debuggen und sie sind eine Fülle von Tools, die speziell auf das Aufspüren dieser Art von Problemen ausgerichtet sind.

Erstens, Wenn es einen Absturz gibt, gibt es eine Backtrace. Veröffentliche es. Wahrscheinlich nicht , dass interessant in diesem Fall, aber, immer noch auf den Backtrace schauen, um zumindest zu bestätigen, dass es abstürzt wo/wie Sie denken, dass es ist.

Aus den geposteten Nachweisen klingt es wie theVCardN.FirstName ist entweder auf Müll gesetzt oder die zugrunde liegende Zeichenfolge wurde zu viel freigegeben. Schalten Sie den Zombie-Erkennungsmodus ein und sehen Sie, ob das der Fall ist. Da es auf FirstName abstürzt, dann zeigen Sie den Code zum Erstellen/Speichern der FirstName.

Auch Instanzvariablen und Methoden sollten immer mit einem Kleinbuchstaben beginnen; PersonName sollte personName sein & FirstName sollte firstName sein.

+0

thx für Ihre Hilfe! Es war ein vernebeltes "Zurückhalten" bei der Übergabe von Daten an eine Klasse. Ich habe meinen Code neu geschrieben, um die von Ihnen erwähnten Code-Konventionen zu befolgen. Vielen Dank ! – MadMaxAPP

0

Vielleicht liest ich bin den Code falsch oder Ihre Klassenstruktur Missverständnis, aber es sieht aus wie Sie Anmeldung:

NSLog(@"Save to Adressbook: %@", theVCardN.FirstName); 

Oben, wo Sie sagen, dass es noch funktioniert, Sie sich anmelden:

theVCard.PersonName.FirstName 

Vermissen Sie den "PersonName"? Das bedeutet, dass Sie sich anmelden sollten:

NSLog(@"Save to Adressbook: %@", theVCardN.PersonName.FirstName); 
+0

nein, in 'initWithVCard' mache ich' theVCard = [aVCard behalten]; theVCardN = [theVCard.PersonName retain]; 'Damit lädt die VCardN das Objekt" PersonName "aus einer Vcard. (Ich dachte, es sollte so sein) – MadMaxAPP