2010-02-26 4 views
0

Je chargement des données dynamiquement à partir d'une API à l'aide d'un UISearchBar et d'essayer de l'afficher, en utilisant quelque chose comme ceci:EXC_BAD_ACCESS sur reloadData

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 
{ 
    [searchBar resignFirstResponder]; 
    NSLog(@"Search Text: %@",[searchBar text]); 
    [self startSearchingWithText:[searchBar text]]; 
} 
- (void) startSearchingWithText:(NSString *)text { 
    ... 
    // Go through the list of services and set up a query for the search term 
    QueryServiceManager *manager = [[QueryServiceManager alloc] initWithServices: services]; 

    // Set up the query 
    if (![manager addKeyword: text]) 
     NSLog(@"PROBLEM!"); 

    // Execute the query and store the titles in an array 
    self.data = [[manager makeQuery] copy]; // Returns a NSArray 

    NSLog(@"%@",self.data); 

    // Add the items to the tableView 

    [self.tableView reloadData]; 

Mon code UITableViewController est configuré pour lire self.data, qui est d'abord un NSArray de @"" éléments, tels que:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    [self.data count]; 
} 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 

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

    // Set up the cell... 

    cell.textLabel.text = [self.data objectAtIndex:indexPath.row]; 

    return cell; 
} 

Tout ce que je reçois quand je fais est:

(gdb) continuer 2010-02-26 18: 43: 32.515 iSave [11690: 207] ( "Ordinateur portable Toshiba Satellite L505-GS5037 TruBrite 15,6" (noir) ", " Dell Inspiron 11 Obsidian 11,6 pouces Ordinateur portable noir (Windows 7 Premium) ", " ASUS Eee PC Netbook 1005PE-MU17-BK Netbook noir 10,1 pouces - Jusqu'à 11 heures d'autonomie ", " SwissGear Computer Backpack (Red) ", " Belkin 36- Trousse d'outils informatiques dématérialisés avec étui (noir) ", " Compaq EVO N610C ", " Trousse d'outils informatiques 55 pièces Belkin F8E062 avec boîtier noir (outils démagnétisés) ", " Coque ASUS Eee PC 1005PE-PU17-BK 10.1 Noir Netbook -inch - Jusqu'à 14 heures de la vie de la batterie " " Harman Kardon SoundSticks II 2.1 Système de haut-parleurs multimédias Plug and Play ", " ION Audio VCR 2 Convertisseur vidéo USB vers ordinateur VHS " ) (gdb) continuer Programme reçu signal:" EXC_BAD_ACCESS ". (gdb)

Des idées? On dirait que le NSArray est en cours à jour correctement, alors les choses ne parviennent pas à/après l'appel reloadData (points d'arrêt confirment, mais ne peut pas isoler où les choses vont mal)

EDIT: J'ai remplacé le NSLog() avec énumération

for (NSString *elem in self.data) 
    NSLog(elem); 

Et il se bloque toujours. J'ai réussi à coaxer un journal hors de celui-ci: http://pastebin.com/NDVKLsJC

Lorsque je supprime le NSLog() entièrement, il ne se bloque pas, mais le UITableView ne met pas à jour non plus.

+0

où vous appelez reloadData? – nickthedude

+0

oh je ne vois rien là-bas – nickthedude

+0

Sous la commande NSLog() ci-dessus. Cette fonction est appelée automatiquement lorsque le bouton "Rechercher" est touché. Post édité pour afficher la définition complète. –

Répondre

1

Quelque chose de bizarre: Vous dites que vous avez seulement 1 rang dans chaque section, mais vous utilisez indexPath.row pour indexer dans votre tableau? L'un d'entre eux est faux, et je suppose que c'est le premier. Habituellement, si vous affichez un tableau (n éléments) dans un UITableView, vous avez une section et n lignes dans cette section, ce qui signifie que vous utiliseriez [myArray objectAtIndex:indexPath.row] pour récupérer l'objet approprié.

Si vous voulez une section distincte pour chaque élément du tableau, alors vous dites que vous avez des sections n et 1 rang dans chaque section, puis utilisez [myArray objectAtIndex:indexPath.section] pour récupérer l'objet approprié.

Oh, et vous fuite de mémoire dans tous les sens.

+0

Comme la personne ci-dessous, j'ai juste "return 1;" là-bas à des fins de test. Je vais modifier le code ci-dessus pour refléter cela, et mettre le bon code ([self.data count]), mais c'est toujours le même problème. –

0

Qu'en est-:

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

au lieu de toujours revenir 1.

+0

Ce n'est pas le problème; Je l'ai retourné 1 afin que je puisse m'assurer que cela fonctionne sans passer par tout le processus. Si cela fonctionne pour 1, il sera plus facile de le faire fonctionner pour l'ensemble du tableau. Je viens d'éditer le code pour refléter le "bon" comptage, mais le même problème se pose. –

3

Avez-vous identifié l'objet auquel vous essayez d'accéder mais qui n'existe plus, l'objet qui donne EXC_BAD_ACCESS?

Si ce n'est pas le cas, vous devez activer Zombies dans votre application, puis vous pouvez envoyer une commande à gdb qui vous indiquera quel objet est à l'origine du crash.

0

Hit décalage de commande b pour analyser le projet et résoudre tous les problèmes affichés (fuites potentielles, etc.)