2010-09-29 6 views
6

La mia app si arresta in modo anomalo, si tratta di un problema che deriva dall'API AddressBook, si verifica solo con alcuni contatti.AddressBook Arresto anomalo, solo con alcuni contatti

Ecco il log:

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 

Questo mi sta facendo impazzire, come succede solo con un numero isolato di contatti.

Qualsiasi aiuto sarebbe molto apprezzato.

Qui è il codice che è stato richiesto, vi ringrazio molto per il vostro aiuto:

(Si tratta di un estratto del metodo in cui penso che l'errore accade)

La cosa strana è che si verifica solo con determinati contatti, e l'eliminazione del contatto, quindi la creazione di uno nuovo risolve il 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

Qual è l'ingresso che si crea l'incidente? Succede sempre per qualche contatto specifico? Qual è il messaggio di errore pure? – vodkhang

+1

Includendo il codice da '- [CallAppDelegate peoplePickerNavigationController: shouldContinueAfterSelectingPerson: property: identificatore:]' sarebbe molto utile, specialmente il codice attorno alla riga 408 di AppDelegate.m. –

+0

Ho incluso il codice in cui penso che l'errore si verifichi, sarebbe consigliabile avvolgere l'intero estratto con @try @catch? – Zebs

risposta

12

A chiunque sperimentando un problema simile:

mio errore derivava dal fatto che stavo usando:

ABMultiValueCopyValueAtIndex con un identificatore al posto di un indice.

È necessario chiamare ABMultiValueGetIndexForIdentifier e quindi utilizzare tale indice su ABMultiValueCopyValueAtIndex.

La riga inferiore è Identifier!=index.

0

avrei assicurarsi che si sta davvero trattare con valide più valore tipo di record.

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

In realtà, sarebbe probabilmente più sicuro assicurarsi che fosse davvero una stringa.

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

Non so perché questo non sarebbe il caso. Forse hai voci di contatti corrotte? O forse a volte il numero di telefono non è un tipo a più valori?

2

Invece di usare

ABMultiValueCopyValueAtIndex(multiValue, identifier);

Quali Zebs sottolineato in precedenza, l'uso ...

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