2010-09-29 10 views
6

Mi aplicación falla, es un problema que surge de la API de la libreta de direcciones, solo ocurre con algunos contactos.AddressBook Crash, solo con algunos contactos

Aquí está el registro:

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 

Esto me está volviendo loco, ya que sólo ocurre con un número aislado de contactos.

Cualquier ayuda sería muy apreciada.

Este es el código que se ha solicitado, muchas gracias mucho por su ayuda:

(se trata de un extracto del método en el que creo que ocurre el error)

Lo extraño es que se sólo ocurre con ciertos contactos y eliminar el contacto y la creación de uno nuevo resuelve el problema ...

- (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

¿Cuál es la entrada que se cree el accidente? ¿Esto siempre sucede para algún contacto específico? ¿Cuál es el mensaje de error también? – vodkhang

+1

Incluir el código de '- [CallAppDelegate peoplePickerNavigationController: shouldContinueAfterSelectingPerson: property: identifier:]' sería muy útil, especialmente el código alrededor de la línea 408 de AppDelegate.m. –

+0

He incluido el código donde creo que ocurre el error. ¿Sería recomendable envolver todo el extracto con @try @catch? – Zebs

Respuesta

12

Para cualquier persona que experimenta un problema similar:

Mi error vino del hecho de que yo estaba usando:

ABMultiValueCopyValueAtIndex con un identificador en lugar de un índice.

Tiene que llamar al ABMultiValueGetIndexForIdentifier y luego usar ese índice en el ABMultiValueCopyValueAtIndex.

La línea inferior es Identifier!=index.

0

me asegurarse de que está realmente tratar con múltiples válida tipo de registro de valor.

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

En realidad, probablemente sería más seguro asegurarse de que realmente es una cadena.

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

No sé por qué este no sería el caso. Tal vez tienes entradas de contactos corruptas? ¿O tal vez a veces el número de teléfono no tiene un valor múltiple?

2

En lugar de utilizar

ABMultiValueCopyValueAtIndex(multiValue, identifier);

Qué Zebs señaló anteriormente, el uso ...

ABMultiValueCopyValueAtIndex(multiValue, ABMultiValueGetIndexForIdentifier(multiValue, identifier)); 
Cuestiones relacionadas