2009-05-31 10 views
3

ich einen Fehler in meiner Konsole bekommen:"isEqualToString" Cocoa Fehler

2009-05-30 20: 17: 05,801 ChuckFacts [1029: 20b] *** - [Joke isEqualToString:]: unerkannt Selektor gesendet Instanz 0x52e2f0

Hier mein Code ist, dass ich die Fehler glauben herkommt:

- (UITableViewCell *)tableView:(UITableView *)tableView 
    cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
static NSString *CellIdentifier = @"Joke"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 
    [[NSBundle mainBundle] loadNibNamed:@"TableCell" owner:self options:nil]; 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero 
            reuseIdentifier:CellIdentifier] autorelease]; 
    cell = tableCell; 
} 

NSString *jokeText = [jokes objectAtIndex:indexPath.row]; 
UILabel *jokeTextLabel = (UILabel*) [cell viewWithTag:1]; 
jokeTextLabel.text = jokeText; 
NSString *dateText = formattedDateString; 
UILabel *dateTextLabel = (UILabel*) [cell viewWithTag:2]; 
dateTextLabel.text = dateText; 
[self todaysDate]; 
return cell; 
} 

„Witze“ ist ein Array voll Witze, falls Sie wissen müssen

Warum kommt dieser Fehler?

Auch tun Sie das Teil des Fehlers sehen, der sagt:

zum Beispiel gesendet 0x52e2f0

Wie kann ich bestimmen, was „0x52e2f0“ ist so wäre es einfacher, das zu finden, Problem beim nächsten Mal?

+0

Genaues Duplikat: http://stackoverflow.com/questions/865527/cocoa-i-have-an-error-and-after-reading-and-try-to-figure-it-out-i-cant –

Antwort

18

Warum kommt dieser Fehler?

Weil Sie isEqualToString: an einen Witz Objekt senden, und Ihre Joke Objekte reagieren nicht auf isEqualToString:.

Sie senden diese Nachricht wahrscheinlich nicht absichtlich an Ihre Joke-Objekte. Stattdessen übergeben oder geben Sie Joke-Objekte an Objekte zurück, die NSString-Objekte erwarten.

Sie sagen, dass jokes ein "Array voller Witze" ist.Doch in Ihrem Code, tun Sie dies:

NSString *jokeText = [jokes objectAtIndex:indexPath.row]; 
UILabel *jokeTextLabel = (UILabel*) [cell viewWithTag:1]; 
jokeTextLabel.text = jokeText; 

von der Ausnahme gehen, ich vermute, dass durch „Array voller Witze“, Sie „Array von Joke Objekte“ gemeint.

Wenn Sie ein Joke-Objekt in eine NSString *-Variable einfügen, wird das Joke-Objekt nicht in einen NSString umgewandelt. Sie sagen dem Compiler nur, dass die Variable einen NSString enthält, und fügt stattdessen einen Joke hinzu. Ich nenne das "Lügen zum Compiler".

Der erste Schritt dieser bei der Festlegung der Lüge zu entfernen und Wahrheit in seinen Platz wieder her:

Joke *joke = [jokes objectAtIndex:indexPath.row]; 

Wenn Sie sofort kompilieren dies nach tun, werden Sie feststellen, dass der Compiler gestartet hat Sie geben eine Warnung später ein paar Zeilen:

jokeTextLabel.text = jokeText; 

Warnung: Übergabe des Arguments 1 von 'setText:' aus verschiedenen Objective-C-Typ

Es ist natürlich richtig. Witze sind immer noch nicht NSStrings. Nun, da Sie ehrlich sind über den Typ der Variablen, kann der Compiler dies für Sie erfassen.

Die eigentliche Update kommt, wenn Sie den Witz Objekt für seinen Text fragen (ich nehme an, dass es eine Eigenschaft für diese hat, und dass der Wert dieser Eigenschaft ist ein NSString) und dass zum jokeTextLabel.text Setter geben.

Wie kann ich feststellen, was "0x52e2f0" ist, so dass es einfacher wäre, das Problem beim nächsten Mal zu finden?

Setzen Sie im Xcode-Fenster Haltepunkte einen Haltepunkt auf objc_exception_throw. Dann führe dein Programm aus. Wenn die Ausnahme auftritt, stoppt der Debugger Ihr Programm und das Debugger-Fenster wird geöffnet. Geben Sie dann po 0x52e2f0 in die Debugger-Konsole ein. (po steht für "print object".)

Dies funktioniert für Mac-Anwendungen; Ich gehe davon aus, dass es auch für iPhone-Apps funktionieren würde.

+0

Noch eine ausgezeichnete Antwort von Ihnen, Peter. – Abizern

2

Mit "ein Array voller Witze", meinen Sie offenbar "ein Array voller Klassen des Typs Joke". Sie können ein Joke-Objekt nicht einer UILabel-Eigenschaft text zuweisen, sondern nur NSString.

(Cocoa ist nicht wie Java oder C++, wo jedes Objekt kann durch einige .toString() Methode automatisch in einen String umgewandelt werden. Im Allgemeinen wird die Rahmenbedingungen für NSString s fragt ausdrücklich, wenn es eine Zeichenfolge will.)

Hier ist, was ist passiert: Sie vergeben ein Joke Objekt an die text Eigenschaft. Cocoa ermöglicht es Ihnen, schnell und locker mit solchen Typen zu spielen, ohne dass Sie in diesem Fall eine Warnung erhalten, da dies implizit als NSString verstanden wird (der Typ id wird automatisch zu dem Typ, dem Sie ihn zuweisen). Aber wenn es versucht, isEqualToString: (eine NSString-Methode) für ein Joke-Objekt aufzurufen, schlägt es natürlich fehl.

Sie müssen stattdessen den Text des Witzes der Beschriftung zuweisen.

Zum Identifizieren des Objekts: Sie können den po 0x52e2f0-Befehl im Debugger ausgeben, was normalerweise funktioniert, wenn der Speicher nicht vollständig geborsten ist. Es wird eine Objective-C-Darstellung des Objekts unter dieser Adresse gedruckt.

+1

Tatsächlich gibt es in diesem Fall keine (relevante) Typumwandlung: Die NSArray-Nachricht objectAtIndex: gibt 'id' zurück, die ohne Warnung mit einem beliebigen Zeigertyp verknüpft werden kann. –

+0

In der Tat hast du recht. Korrigiert. –

+0

Sie können tatsächlich eine Zeichenfolgendarstellung irgendeines Objekts mit der Methode -description abrufen. Die Standardimplementierung würde einfach so etwas wie zurückgeben, es sei denn, Sie würden es überschreiben. –

Verwandte Themen