2009-10-13 6 views
0
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
//NSLog(@"Array: %@",rows); 
    return [rows count];// AT THIS LINE 
} 

Programme signal reçu: « EXC_BAD_ACCESS »uitableview Donner erreur

MERCI POUR REPONDRE En fait, je l'ai attaché à la WebPage par NSURL où j'ai fait un tableau PHP et j'ai créé un NSLog où je Je reçois les valeurs dans le tableau, mais quand il excute la ligne retour [nombre de lignes] ;. Il donne une erreur lorsque j'écris statiquement return 2; puis il s'exécute. Je vous explique ce que je fais. J'INITIALISATION le BNR avec

Name tableViewController=[[JsonTestViewController alloc] initWithNibName:@"JsonTestViewController" bundle:nil]; 

En JsonTestViewController.m J'ai ce code:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    //NSLog(@"Array: %@",rows); 
    return [rows count]; 
} 
// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    } 

    // Configure the cell. 
    NSDictionary *dict = [rows objectAtIndex: indexPath.row]; 
    NSString *strlb1=[dict objectForKey:@"block"]; 
    NSString *strlb2=[dict objectForKey:@"name"]; 
    strlb1=[strlb1 stringByAppendingString:@" , "]; 
    strlb1=[strlb1 stringByAppendingString:strlb2]; 
    NSString *[email protected]"FPS : "; 
    NSString *str2=[dict objectForKey:@"p_hours"]; 
    NSString *strpinf; 
    if([str2 isEqualToString:@"FP"]) 
    { 
     [email protected]"Free Parking"; 
    } 
    else if([str2 isEqualToString:@"12"]) 
    { 
     [email protected]"2 hours"; 
    } 
    else if([str2 isEqualToString:@"14"]) 
    { 
     [email protected]"4 hours"; 
    } 
    else if([str2 isEqualToString:@"MP"]) 
    { 
     [email protected]"Metered Parking"; 
    } 
    str1=[str1 stringByAppendingString:strpinf]; 
    cell.textLabel.text =strlb1; 
    cell.detailTextLabel.text = str1; 



    return cell; 
} 
- (void)viewDidLoad { 

    [super viewDidLoad]; 
    NSURL *url = [NSURL URLWithString:@"SITE URL"]; 
    NSString *jsonreturn = [[NSString alloc] initWithContentsOfURL:url]; 

    NSData *jsonData = [jsonreturn dataUsingEncoding:NSUTF32BigEndianStringEncoding]; 
    NSError *error = nil; 


    NSDictionary * dict = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:&error]; 
    if (dict) 
    { 
     rows = [dict objectForKey:@"users"]; 
    } 

    NSLog(@"Array: %@",rows); 
    [jsonreturn release]; 
} 



- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidUnload { 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 


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

@end 
+0

Pouvez-vous s'il vous plaît poster le code où les lignes sont créées? Il semble que vous ne conserviez pas les lignes, et au moment où -tableView: numberOfRowsInSection: est appelé, les lignes ont été auto-libérées. –

+0

J'ai posté le code – IPhoneCrazy

Répondre

0

peut vous donner plus d'informations? Cela peut être n'importe quoi, mais très probablement, les lignes pointent vers la mémoire où un tableau valide était utilisé. Comment avez-vous créé le tableau rows? Par exemple, votre tableau de lignes ou dictionnaire ne pointe plus vers la mémoire valide si vous avez créé le tableau de lignes en tant qu'objet auto-libéré via une méthode usine dans une autre méthode.

Voici une autre question qui est assez proche de ce que vous décrivez:

EXC_BAD_ACCESS signal received

EDIT:

recherche donc le code que vous avez fourni, avec ces lignes il y a quelques possibilités:

NSDictionary * dict = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:&error]; 
    if (dict) { rows = [dict objectForKey:@"users"]; } 

La méthode deserializeAsDictionary peut renvoyer un dictionnaire autoreleased ou NULL. donc une possibilité est que rows = NULL. lorsque vous essayez [nombre de lignes], votre programme va planter. Vérifiez et voyez ce qui est dans l'erreur, pourrait vous donner quelques indices.

Cela provoquera une erreur même lorsque vous renverrez explicitement 2 pour numberOfRowsInSection: car dans cellForRowAtIndexPath:, vous essayez toujours d'accéder aux lignes, même si cela peut éventuellement être NULL.

L'autre possibilité réside dans la façon dont vous avez défini des lignes. Je suppose que c'est une propriété dans ta classe. Mais où vous avez rows=[dict objectForKey:@"users"];, les lignes peuvent pointer vers rien après la fin de la méthode. Les lignes auront toujours l'adresse d'où [dict objectForKey:] était, mais après la portée de la méthode, dict peut être parti et toutes les données qui l'accompagnent. Selon les directives du KVC, vous devriez vous attendre à ce que la libération automatique soit terminée après la fin de la méthode. Et une autre possibilité est, puisque je ne connais pas les spécificités de la classe JSON que vous utilisez, c'est que lorsque vous relâchez jsonreturn, vous libérez aussi toutes les données qui lui sont associées. Donc, en effet, les lignes ne pointent vers rien.

Par exemple, l'erreur semble être ancrée dans la façon dont vous définissez/retenez/accédez aux lignes.

essayez d'utiliser le Build-> Build & Analyse dans xcode. cela pourrait vous donner d'autres indices. ou jeter dans un tas de NSLog(@"%d",[rows count]); partout. essayez également d'utiliser le débogueur. cela vous donnera une trace d'appels de méthodes qui conduisent à des erreurs de [nombre de lignes].

+0

Merci pour la réponse. Mais j'ai vérifié avec les options que vous avez déjà données. Il se bloque lorsque j'écris return [nombre de lignes]; au lieu de retourner 1,2; et quand j'écris, tapez return 2; le code donne une erreur sur [UITableView layoutSubviews]. Mais j'ai vérifié que les lignes NSLog retournent en tant que tableau et que le nombre de tableaux est 10. S'il vous plaît laissez-moi savoir où je vais mal Message d'erreur que je reçois est IPhoneCrazy

+0

Merci à l'avance – IPhoneCrazy