2009-12-01 4 views
0

Ceci est un extrait de code que j'ai eu des problèmes avec. J'ai une application iPhone qui fonctionne bien pour 99% de mes utilisateurs, mais pour environ 1%, j'ai ce bug que je ne peux pas résoudre ou reproduire de mon côté. L'application se fige juste pour eux, et ne plante pas réellement (donc pas de rapports d'erreur). Certains tests de distribution ad hoc ont révélé que le problème était dans cette partie du code. Si quelqu'un a une idée de ce que le problème pourrait être, s'il vous plaît faites le moi savoir. Merci.problème avec NSString stringWithString, dans l'application iPhone

NSString *addChar = nil; 

    NSString *fullname = (NSString *)ABRecordCopyCompositeName(record); 
    addChar = [[NSString stringWithString: [[fullname substringToIndex:1] capitalizedString]] retain]; 

    [fname release]; 

    NSMutableArray *array = [app_contacts objectForKey:addChar]; // lookup if key exists 

    if (array == nil) // if nothing in key, create new array 
    { 
      NSLog(@"array empty"); 
      NSMutableArray *newarray = [[NSMutableArray alloc] init]; 
      [newarray insertObject:one_person atIndex:0]; 
      [app_contacts setValue:newarray forKey:addChar]; 
      [newarray release]; 
    } 
    else 
    { 
      NSLog(@"array not empty"); 
      [array addObject:one_person]; 
      [app_contacts setValue:array forKey:addChar]; 
    } 

    [addChar release]; 
+1

Qu'est-ce que fname dans "[fname release]"? –

+0

Il devrait être [version complète]. J'ai coupé et collé seulement les bits pertinents d'une longue méthode, donc il y a quelques références qui ne sont pas correctes. –

Répondre

1

Pourquoi faites-vous cela?

addChar = [[NSString stringWithString: [[fullname substringToIndex:1] capitalizedString]] retain]; 

Vous récupérez une chaîne déjà:

addChar = [[fullname substringToIndex:1] capitalizedString]; 

élimine la nécessité de [addChar release] aussi bien.

+0

Merci. Mais qu'est-ce qui pourrait poser problème avec stringWithString (même dans le pire des cas)? –

+0

Je pourrais prévoir une erreur de compte de retenue étrange, puisque vous avez affaire à quelques allocations là - seulement bizarre je vois, honnêtement, le reste du code semble bien (d'où ma réponse). Il y a des symboles dans cet extrait qui sont déclarés ailleurs, et sans un * défini c'est la ligne * c'est tout ce que j'ai. –

+0

De mes tests, il est assez évident pour moi que c'est la ligne de problème. Mais je ne comprends pas exactement pourquoi, et par conséquent, je ne suis pas sûr de la meilleure solution. Les utilisateurs qui ont ce problème geler à plusieurs reprises à ce stade, alors que je suis en boucle dans leur carnet d'adresses. Si c'était un problème de nombre de retenue étrange, serait-ce un problème récurrent pour la même personne, même après avoir redémarré son iPhone? –

3

Dans ce code:

NSString *fullname = (NSString *)ABRecordCopyCompositeName(record); 
addChar = [[NSString stringWithString: [[fullname substringToIndex:1] capitalizedString]] retain]; 

Si fullname est égal à @ "", alors vous soulevez une exception lorsque vous invoquez [fullname substringToIndex: 1].