"isEqualToString" Kakao-Fehler
Ich eine Fehlermeldung in meiner Konsole:
2009-05-30 20:17:05.801 ChuckFacts[1029:20b] *** -[Witz isEqualToString:]: unrecognized
selector geschickt Instanz 0x52e2f0
Hier ist mein code, ich glaube der Fehler kommt von:
- (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 voller Witze, incase Sie brauchen, zu wissen,
Ist, warum diese Fehler kommen?
Auch, sehen Sie der Teil des Fehlers, der sagt:
geschickt Instanz 0x52e2f0
Wie kann ich bestimmen, was "0x52e2f0" ist, so wäre es einfacher das problem zu finden, das nächste mal?
- Exakte Kopie: stackoverflow.com/questions/865527/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil Sie senden
isEqualToString:
zu einem Witz-Objekt, und Ihrem Witz Objekte reagieren nicht aufisEqualToString:
.Sind Sie wahrscheinlich nicht absichtlich senden, dass die Nachricht von Ihrem Witz Objekte, sondern Sie sind die Weitergabe oder der Rückkehr Witz Objekte zu etwas, das erwartet wird NSString-Objekte.
Ihnen sagen, dass
jokes
ist ein "array von voller Witze". Doch in Ihrem code, Sie dies tun:Gehen durch die Ausnahme, ich vermute, dass durch die "array voller Witze", Sie meinte "array von Witz Objekte".
Putting ein Witz-Objekt in ein
NSString *
variable nicht wiederum der Witz-Objekt in ein NSString. Alles, was Sie tun, ist sagen dem compiler, dass die variable enthält einen NSString, dann ein Witz hinein statt. Ich nenne das "Lügen für den compiler".Der erste Schritt bei der Festsetzung dieser ist zu entfernen, die Lüge und die Wiederherstellung Wahrheit seinen Platz:
Wenn Sie kompilieren sofort nachdem Sie dies getan haben, werden Sie feststellen, dass der compiler hat begonnen, geben Sie eine Warnung, ein paar Zeilen später:
Es ist richtig, natürlich. Witze sind immer noch nicht NSStrings. Du bist jetzt ehrlich über die variable Art, kann der compiler fangen diese für Sie.
Die eigentliche Korrektur kommt, wenn Sie Fragen, die Witz-Objekt für seinen text (ich gehe davon aus, dass es eine Eigenschaft ist, und dass der Wert dieser Eigenschaft ist ein NSString) und geben , dass der
jokeTextLabel.text
setter.In Xcode das Breakpoints-Fenster, setzen Sie einen breakpoint auf
objc_exception_throw
. Dann läuft dein Programm. Wenn die exception passiert, der debugger Stoppt das Programm, und das Debugger-Fenster wird geöffnet. Dann geben Siepo 0x52e2f0
in die Debugger-Konsole. (po
steht für "print-Objekt".)Dies funktioniert für Mac apps; ich gehe davon aus, es würde auch für iPhone apps.
Durch "ein array voller Witze", die Sie offenbar meinen, "ein array voller Klassen des Typs Witz". Sie können nicht zuweisen, ein Witz-Objekt zu einem UILabel ist
text
Eigenschaft—dauert esNSString
nur.(Kakao ist nicht wie Java oder C++, wo jedes Objekt kann gezwungen werden zu einer Zeichenfolge automatisch durch einige
.toString()
Methode. Im Allgemeinen Rahmen verlangtNSString
s explizit, wenn es will einen string.)Hier ist, was passiert: du bist die Zuweisung einer
Joke
Objekt dertext
Eigenschaft. Kakao können Sie spielen schnell und Locker mit Typen wie diesem, ohne auch nur eine Warnung in diesem Fall, da es implizit verstanden werden, um ein NSString (dieid
geben wird still geworden, was Typ, den Sie zuweisen). Aber wenn er versucht zu rufenisEqualToString:
(ein NSString-Methode) auf ein Witz-Objekt, natürlich scheitert er.Weisen Sie den Witz text auf dem Etikett statt.
Wie man das Objekt erkennen kann: Sie können die Ausgabe der
po 0x52e2f0
Befehl im debugger, was in der Regel funktioniert, wenn der Speicher nicht komplett geschlafen. Es gibt ein Objective-C Darstellung des Objekts an dieser Adresse.