2009-05-14 10 views
0

Ich erhalte diese Fehlermeldung:Warum erhalte ich einen isEqualToString-Fehler in diesem Cocoa-Code?

alt text http://img514.imageshack.us/img514/2203/help.tif

Was ist das? Ich habe nie "isEqualToString" aufgerufen.

ist hier mein Joke.M

@implementation Joke 
@synthesize joke; 
@synthesize rating; 


- (id)init { 
[super init]; 
return self; 
} 

- (void)dealloc { 
[joke release]; 
[super dealloc];  
} 

+ (id)jokeWithValue:(NSString *)joke { 
Joke *j = [[Joke alloc] init]; 
j.joke = joke; 
return [j autorelease]; 
} 

@end 

Und hier ist joke.h

@interface Joke : NSObject { 
NSString *joke; 
int rating; 
} 

+ (id)jokeWithValue:(NSString *)joke; 

@property (readwrite, copy) NSString *joke; 
@property (readwrite) int rating; 

@end 

Und hier ist, wo ist Witz

#import "TableViewController.h" 
#import "Joke.h" 

@implementation TableViewController 
@synthesize jokes; 

- (id)initWithCoder:(NSCoder *)coder { 
if (self = [super initWithCoder:coder]) { 
    self.jokes = [NSMutableArray arrayWithObjects: 
        [Joke jokeWithValue:@"If you have five dollars and Chuck Norris has five dollars, Chuck Norris has more money than you"], 
        [Joke jokeWithValue:@"There is no 'ctrl' button on Chuck Norris's computer. Chuck Norris is always in control."], 
        [Joke jokeWithValue:@"Apple pays Chuck Norris 99 cents every time he listens to a song."], 
        [Joke jokeWithValue:@"Chuck Norris can sneeze with his eyes open."], 
        nil]; 
    } 
return self; 
} 

- (void)viewDidLoad { 
self.navigationItem.leftBarButtonItem = self.editButtonItem; 
} 


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { // Saying how many sections wanted (Just like in address, where sorts by first name) 
return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView 
numberOfRowsInSection:(NSInteger)section { 
return [jokes count]; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView 
    cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Team";  
    UITableViewCell *cell = 
[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
    cell = [[[UITableViewCell alloc] 
      initWithFrame:CGRectZero 
      reuseIdentifier:CellIdentifier] autorelease]; 
    } 
cell.text = [jokes objectAtIndex:indexPath.row]; 
    return cell; 
    } 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
} 


- (void)viewWillAppear:(BOOL)animated { 
[super viewWillAppear:animated]; 
} 

- (void)viewDidAppear:(BOOL)animated { 
[super viewDidAppear:animated]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation: 
(UIInterfaceOrientation)interfaceOrientation { 
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
    } 

- (void)didReceiveMemoryWarning { 
[super didReceiveMemoryWarning]; 
} 

- (void)dealloc { 
[jokes release]; 
[super dealloc]; 
} 

@end 

Dank

verwendet wird
+4

Ein Objekt wird wie eine Zeichenfolge verglichen. Sie müssen mehr Informationen geben und Code anzeigen. Zeigen Sie den Code, wo dies geschieht. –

+0

Kk Ich habe meinen Code dort hinzugefügt. Entschuldigung, dass ich nicht vor –

+0

hinzugefügt habe Könnten Sie den Code, wo Joke verwendet wird, nicht nur dort, wo es definiert ist, posten? – chaos

Antwort

11

diese Zeile ersetzen:

cell.text = [jokes objectAtIndex:indexPath.row]; 

mit diese Zeilen:

Joke *j = (Joke *)[jokes objectAtIndex:indexPath.row]; 
if(j) 
    cell.text = j.joke; 
+0

AHH IT FUNKTIONIERT! VIELEN DANK! –

+2

Ja, das funktioniert, weil cell.text eine Zeichenfolge erwartet, kein Scherzobjekt. Zuvor hat der Accessor von cell.text das Objekt, das Sie ihm gegeben haben (ein Joke), mit dem Objekt verglichen, das er bereits hatte (ein NSString), und deshalb haben Sie diese Ausnahme gesehen. Eine andere Möglichkeit, die Sie hätten beheben können, wäre eine Implementierung von isEqualToString: in Ihrem Joke-Objekt hinzuzufügen und diese Anfrage an Ihre joke -Eigenschaft weiterzuleiten. –

+0

macht Sinn! Vielen Dank, Mann –

0

Ihre Fehlermeldung wird nicht angezeigt layed, aber ich nehme an, Sie sind in eine Anweisung gelaufen, die hinter den Kulissen isEqualToString aufruft und eines der Objekte ist keine Zeichenkette

1

Der Fehler ist nicht in der Definition der Joke-Klasse, aber irgendwo ist es benutzt. In den meisten Fällen mit Fehlern wie dieser ist es das Ergebnis eines Speicherverwaltungsfehlers - ein Objekt (vermutlich eine Zeichenfolge) wird freigegeben und ein anderes wird an seinem alten Speicherort zugewiesen. Versuchen Sie, mit NSZombieEnabled zu laufen und sehen Sie, ob es eine Nachricht zu einem delalloced Objekt zeigt.

+0

Das ist hier nicht der Fall, aber ich lasse es für Google-Zwecke, weil es oft das Problem in solchen Fällen ist. – Chuck

2

Sie überschatten einen Ivar-Namen mit dem Funktionsargument. Versuchen Sie, Ihre jokeWithValue Wechsel: Methode dazu:

In joke.h:

+ (id)jokeWithValue:(NSString *)aJoke; 

in joke.m:

+ (id)jokeWithValue:(NSString *)aJoke { 
    Joke *j = [[Joke alloc] init]; 
    j.joke = aJoke; 
    return [j autorelease]; 
} 

Beachten Sie, dass die NSString Variablenname hat sich geändert, so dass es nicht mehr Schatten der iVar Witz.

EDIT:

On zu sehen, wie Witz genannt wird, sieht es aus, als ob Sie einen Witz Objekt cell.text zuweisen, die meiner Meinung nach ist ein NSString kein Witz erwartet.

try Einstellung:

cell.text = [[jokes objectAtIndex:index] joke]; 

in - (UITableViewCell *) tableview: (UITableView *) tableview cellForRowAtIndexPath: (NSIndexPath *) indexPath

+0

Ich werde überrascht sein, wenn sich das als Problem herausstellt. Er benutzt den ivar nicht in dieser Methode, also sollte es sicher sein (wenn nicht gerade gute Übung), ihn zu beschatten. – Chuck

+0

Dies würde nicht wirklich seine Ausnahme verursachen, da sie beide tatsächlich NSStrings sind. Er vergleicht wahrscheinlich ein Joke-Objekt mit seinem String-Value-Witz irgendwo. –

+0

Immer noch nicht funktioniert. Gleiche Fehler –

3

Der Stack-Trace wird Ihnen helfen, genau das zu finden, was isEqualToString: aufruft. Leider gibt es dir keine Symbole, also musst du ein bisschen graben.In Objective-C-Methoden gibt es zwei ausgeblendete Parameter, die immer als die ersten beiden Argumente übergeben werden: self, ein Zeiger auf das Objekt, an das die Nachricht gesendet wird, und _cmd, ein Zeiger auf eine C-Zeichenfolge, die enthält Der Name der Nachricht, die gesendet wird. Wenn Sie die Argumente _cmd in den Stack-Frames untersuchen, können Sie das Problem beheben.

Das erste, was Sie tun möchten, ist einen Haltepunkt direkt vor dem Auslösen der Ausnahme setzen. Öffnen Sie die Debugger-Konsole (Cmd + Shift + R) und fügen Sie einen Haltepunkt auf die Funktion auf der Spitze des Stack-Trace, indem Sie:

break 2438463755 

Jetzt ist Ihre Anwendung ausführen, und der Debugger brechen sollte unmittelbar vor dem Werfen Ausnahme. Es sollte Ihnen auch eine vollständige symbolische Rückverfolgung geben; Wenn nicht, müssen Sie selbst den Stapel laufen. Sie können den Stapel laufen lassen und den Wert der verschiedenen _cmd Parameter ausdrucken.

Verwandte Themen