2010-09-29 21 views
6

Moja aplikacja ulega awarii, jest to problem, który powstaje z interfejsu API Książki adresowej, dzieje się tak tylko w przypadku niektórych kontaktów.Awaria książki adresowej, tylko z niektórymi kontaktami

Oto 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 

To doprowadza mnie do szału, jak to się dzieje tylko z izolowanym liczby kontaktów.

Każda pomoc zostanie bardzo doceniona.

Oto kod, który został poproszony, dziękuję bardzo za pomoc:

(Jest to wyciąg z metody gdzie myślę, że błąd zdarza)

Najdziwniejsze jest to, że to dzieje się tak tylko z pewnych kontaktów i usuwanie kontaktu, a następnie utworzenie nowego rozwiązuje problem ...

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

Co jest wejście utworzenie katastrofę? Czy zdarza się to zawsze w przypadku konkretnego kontaktu? Co to jest komunikat o błędzie? – vodkhang

+1

Włączenie kodu z '- [CallAppDelegate peoplePickerNavigationController: shouldContinueAfterSelectingPerson: property: identifier:]' byłoby bardzo pomocne, szczególnie kod wokół linii 408 AppDelegate.m. –

+0

Dołączyłem kod, w którym wydaje mi się, że wystąpił błąd, czy wskazane byłoby zawinięcie całego wyciągu za pomocą @catch @catch? – Zebs

Odpowiedz

12

Każdemu przeżywa podobny problem:

Mój błąd pochodziła z faktu, że byłem przy użyciu:

ABMultiValueCopyValueAtIndex z identyfikatorem zamiast indeksu.

Musisz zadzwonić pod numer ABMultiValueGetIndexForIdentifier, a następnie użyć tego indeksu na ABMultiValueCopyValueAtIndex.

Najważniejsze jest Identifier!=index.

0

Chciałbym upewnić się, że rzeczywiście do czynienia z ważną wielu wartości typu rekordu.

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

Właściwie byłoby bezpieczniej upewnić się, że to naprawdę ciąg.

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

Nie wiem, dlaczego tak nie było. Może masz uszkodzone wpisy kontaktów? A może czasami numer telefonu nie jest typem o wielu wartościach?

2

Zamiast

ABMultiValueCopyValueAtIndex(multiValue, identifier);

Które Zebs wskazano powyżej, stosowanie ...

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