AddressBook Crash, only with some contacts
Asked Answered
S

3

6

My app crashes, it is a problem that arises from the AddressBook API, it only happens with some contacts.

Here is the 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

This is driving me crazy, as it only happens with an isolated number of contacts.

Any help would be greatly appreciated.

Here is the code that was requested, thank you very very much for your help:

(It is an extract from the method where I think the error happens)

The weird thing is that it only happens with certain contacts, and deleting the contact, then creating a new one solves the 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"];
Sillabub answered 29/9, 2010 at 2:30 Comment(3)
What is the input that you create the crash? Does this always happen for some specific contact? What is the error message as well?Cursed
Including the code from -[CallAppDelegate peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:] would be very helpful, especially the code around line 408 of AppDelegate.m.Ferreby
I have included the code where I think the error happens, would it be advisable to wrap the entire extract with a @try @catch?Sillabub
S
12

To anyone experiencing a similar problem:

My error came from the fact that I was using:

ABMultiValueCopyValueAtIndex with an identifier instead of an index.

You have to call ABMultiValueGetIndexForIdentifier and then use that index on the ABMultiValueCopyValueAtIndex.

The bottom line is Identifier!=index.

Sillabub answered 9/10, 2010 at 1:27 Comment(0)
B
2

Instead of using

ABMultiValueCopyValueAtIndex(multiValue, identifier);

Which Zebs pointed out above, use...

ABMultiValueCopyValueAtIndex(multiValue, ABMultiValueGetIndexForIdentifier(multiValue, identifier));
Boyette answered 15/1, 2011 at 7:44 Comment(0)
F
0

I would make sure you're really dealing with valid multi value record type.

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

Actually, it would probably be safer to make sure it's really a string.

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

I don't know why this wouldn't be the case. Maybe you have corrupted contacts entries? Or maybe sometimes the phone number isn't a multi value type?

Ferreby answered 1/10, 2010 at 5:12 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.