2010-09-29 10 views
6

Mon application se bloque, il est un problème qui découle de l'API AddressBook, il se produit uniquement avec des contacts.AddressBook Crash seulement avec quelques contacts

Voici le journal:

Exception Type: EXC_BREAKPOINT (SIGTRAP) 
Exception Codes: 0x00000102, 0x316ebd38 
Crashed Thread: 0 

Thread 0 Crashed: 
0 CoreFoundation     0x00001cfe CFRetain + 90 
1 AddressBook      0x00004b2c ABCMultiValueCopyValueAtIndex + 28 
2 AddressBook      0x0001066a ABMultiValueCopyValueAtIndex + 2 
3 Call Monitor      0x00003824 -[CallAppDelegate peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:] (AppDelegate.m:408) 
4 AddressBookUI      0x00032cfc -[ABPeoplePickerNavigationController personViewController:shouldPerformDefaultActionForPerson:property:identifier:withMemberCell:] + 152 
5 AddressBookUI      0x0003b8ce -[ABPersonViewControllerHelper personTableViewDataSource:selectedPropertyAtIndex:inPropertyGroup:withMemberCell:forEditing:] + 222 
6 AddressBookUI      0x0004a17c -[ABPersonTableViewDataSource valueAtIndex:selectedForPropertyGroup:withMemberCell:forEditing:] + 40 
7 AddressBookUI      0x00048c00 -[ABPersonTableViewDataSource tableView:didSelectRowAtIndexPath:] + 316 
8 UIKit        0x00091f40 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 656 
9 UIKit        0x0009db40 -[UITableView _userSelectRowAtIndexPath:] + 124 
10 Foundation      0x00086c86 __NSFireDelayedPerform + 362 
11 CoreFoundation     0x00071a54 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 8 
12 CoreFoundation     0x00073ede __CFRunLoopDoTimer + 854 
13 CoreFoundation     0x0007485e __CFRunLoopRun + 1082 
14 CoreFoundation     0x0001d8e4 CFRunLoopRunSpecific + 224 
15 CoreFoundation     0x0001d7ec CFRunLoopRunInMode + 52 
16 GraphicsServices     0x000036e8 GSEventRunModal + 108 
17 GraphicsServices     0x00003794 GSEventRun + 56 
18 UIKit        0x000062a0 -[UIApplication _run] + 396 
19 UIKit        0x00004e10 UIApplicationMain + 664 
20 Call Monitor      0x000028e8 main (main.m:14) 
21 Call Monitor      0x000028b8 start + 32 

Cela me rend fou, comme il arrive qu'avec un nombre isolé de contacts.

Toute aide serait grandement appréciée.

Voici le code qui a été demandé, je vous remercie beaucoup pour votre aide:

(Il est un extrait de la méthode où je pense que l'erreur se produit)

La chose étrange est que que certains contacts se produit avec, et supprimer le contact, puis en créant un nouveau résout le problème ...

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person 
           property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier 

    NSString* firstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty); 
    NSString* lastName = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty); 
    NSNumber* record = [NSNumber numberWithInt:ABRecordGetRecordID(person)]; 
    if(lastName!=nil){ 
     name=[NSString stringWithFormat:@"%@ %@",firstName,lastName]; 
    } 
    else { 
     name=firstName; 
    } 

     ABMultiValueRef phone = ABRecordCopyValue(person, property); 
     NSString *value =(NSString *)ABMultiValueCopyValueAtIndex(phone, identifier); 
     NSString *label =(NSString *)ABMultiValueCopyLabelAtIndex(phone, identifier); 
     NSMutableArray *tempArray=[[NSMutableArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"MainArray"]]; 
     NSDictionary *stringDictionary = [NSDictionary dictionaryWithObjectsAndKeys:name, kLabelKey, value, kNumberKey,label, kNumberLabelKey,record, kReferenceKey, nil]; 
     [tempArray addObject:stringDictionary]; 
     NSArray *mainArray = [NSArray arrayWithArray:tempArray]; 
     [[NSUserDefaults standardUserDefaults] setObject:mainArray forKey:@"MainArray"]; 
+0

Quelle est l'entrée que vous créez le crash? Cela arrive-t-il toujours pour un contact spécifique? Quel est le message d'erreur aussi? – vodkhang

+1

Y compris le code de '- [CallAppDelegate peoplePickerNavigationController: shouldContinueAfterSelectingPerson: propriété: identifier:]' serait très utile, en particulier le code autour de la ligne 408 de AppDelegate.m. –

+0

J'ai inclus le code où je pense que l'erreur se produit, serait-il conseillé d'envelopper l'extrait entier avec un @try @catch? – Zebs

Répondre

12

Pour toute personne aux un problème similaire:

Mon erreur vient du fait que j'utilisais:

ABMultiValueCopyValueAtIndex avec un identifiant au lieu d'un index.

Vous devez appeler ABMultiValueGetIndexForIdentifier et utiliser ensuite cet index sur ABMultiValueCopyValueAtIndex.

L'essentiel est Identifier!=index.

0

Je veillerais vous vraiment affaire avec le type d'enregistrement de valeurs multiples valide.

if (ABMultiValueGetPropertyType(phone) != kABInvalidPropertyType) { 
    // Do work here. 
} 

En fait, il serait probablement plus sûr de s'assurer que c'est vraiment une chaîne.

if (ABMultiValueGetPropertyType(phone) == kABMultiStringPropertyType) { 
    // Do work here. 
} 

Je ne sais pas pourquoi ce ne serait pas le cas. Peut-être que vous avez corrompu les entrées de contacts? Ou peut-être parfois le numéro de téléphone n'est pas un type de valeur multiple?

2

Au lieu d'utiliser

ABMultiValueCopyValueAtIndex(multiValue, identifier);

qui Zebs a souligné ci-dessus, l'utilisation ...

ABMultiValueCopyValueAtIndex(multiValue, ABMultiValueGetIndexForIdentifier(multiValue, identifier)); 
Questions connexes