2009-05-14 9 views
0

Je continue à obtenir cette erreur:Pourquoi ai-je une erreur isEqualToString dans ce code Cocoa?

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

Qu'est-ce? Je n'ai même jamais appelé "isEqualToString".

Est Voici mon 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 

Et voici joke.h

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

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

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

@end 

Et voici où blague est utilisé

#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 

Merci

+4

Un objet est comparé comme une chaîne. Vous devez donner plus d'informations et montrer du code. Montrez le code où cela se passe. –

+0

Kk J'ai ajouté mon code là-bas. Désolé, je n'ai pas ajouté avant –

+0

Pourriez-vous poster le code où Joke est utilisé, et pas seulement où il est défini? – chaos

Répondre

11

Remplacer cette ligne:

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

avec ces lignes:

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

AHH ça marche! MERCI BEAUCOUP! –

+2

Oui, cela fonctionne car cell.text attend une chaîne, pas un objet blague. Avant, l'accesseur de cell.text comparait l'objet que vous lui aviez donné (une blague) à l'objet qu'il avait déjà (un NSString) et c'est pourquoi vous voyiez cette exception. Une autre façon de corriger cela était d'ajouter une implémentation de isEqualToString: sur votre objet Joke et de transmettre cette requête à votre propriété blague. –

+0

a du sens! Merci beaucoup –

0

votre message d'erreur n'est pas disp layed mais je suppose que vous avez couru dans une déclaration qui dans les coulisses appelle isEqualToString et l'un des objets n'est pas une chaîne

1

L'erreur ne figure pas dans la définition de la classe Joke, mais quelque part c'est utilisé. Dans la plupart des cas avec des erreurs comme celle-ci, c'est le résultat d'une erreur de gestion de mémoire - un objet (probablement une chaîne) est désalloué et un autre est alloué dans son ancien emplacement mémoire. Essayez d'exécuter avec NSZombieEnabled et voir s'il affiche un message à un objet désalloué.

+0

Cela ne s'est pas avéré être le cas ici, mais je le laisse pour Google, car c'est souvent le problème dans des cas comme celui-ci. – Chuck

2

Vous observez un nom ivar avec l'argument de la fonction. Essayez de changer jokeWithValue: méthode à ceci:

En joke.h:

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

dans joke.m:

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

Notez que le nom de la variable NSString a changé il pas d'ombres plus la blague iVar.

EDIT:

En voyant comment blague est appelé, il semble que si vous affectez un objet de plaisanterie à cell.text, que je crois attend un NSString pas une blague.

essayer Cadre:

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

en - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath

+0

Je serai surpris si cela s'avère être le problème. Il n'utilise pas l'ivar dans cette méthode, donc il devrait être sûr (si ce n'est exactement une bonne pratique) de l'ombre. – Chuck

+0

Cela ne provoquerait pas réellement son exception car ils sont tous les deux réellement NSStrings cependant. Il compare probablement un objet Joke à sa blague de valeur de chaîne quelque part. –

+0

Ne fonctionne toujours pas. Mêmes erreurs –

3

La trace de pile vous aidera à trouver exactement ce que vous appelez isEqualToString:. Malheureusement, il ne vous donne aucun symbole, vous devrez donc creuser un peu.Dans les méthodes Objective-C, deux paramètres cachés sont toujours passés comme les deux premiers arguments: self, un pointeur vers l'objet auquel le message est envoyé, et _cmd, un pointeur vers une chaîne C contenant le nom du message envoyé. L'examen des arguments _cmd dans les cadres de la pile vous aidera à déboguer le problème.

La première chose que vous voulez faire est de définir un point d'arrêt juste avant que l'exception soit levée. Ouvrez la console de débogage (Cmd + Maj + R) et ajouter un point d'arrêt à la fonction sur le haut de la trace de la pile en tapant:

break 2438463755 

Exécutez maintenant votre application, et le débogueur doit casser juste avant de lancer la exception. Il devrait également vous donner un backtrace symbolique complet; sinon, vous devrez marcher vous-même. Vous pouvez parcourir la pile et imprimer la valeur des différents paramètres _cmd.

Questions connexes