【问题标题】:AddressBook Crash, only with some contacts地址簿崩溃,仅与某些联系人有关
【发布时间】:2011-04-18 14:47:24
【问题描述】:

我的应用程序崩溃,这是地址簿 API 引起的问题,它只发生在某些联系人身上。

这是日志:

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

这让我发疯,因为它只发生在少数联系人身上。

任何帮助将不胜感激。

这是请求的代码,非常感谢您的帮助:

(这是我认为发生错误的方法的摘录)

奇怪的是,它只发生在某些联系人身上,删除联系人,然后创建一个新联系人即可解决问题...

- (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"];

【问题讨论】:

  • 您创建崩溃的输入是什么?对于某些特定的联系人,这是否总是发生?还有什么错误信息?
  • 包含来自-[CallAppDelegate peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:] 的代码会非常有帮助,尤其是 AppDelegate.m 的第 408 行附近的代码。
  • 我已经包含了我认为发生错误的代码,是否建议用@try @catch 包装整个提取?

标签: iphone api ios addressbook contact


【解决方案1】:

我会确保您真正处理的是有效的多值记录类型。

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

实际上,确保它确实是一个字符串可能会更安全。

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

我不知道为什么不是这样。也许您的联系人条目已损坏?或者有时电话号码不是多值类型?

【讨论】:

    【解决方案2】:

    致遇到类似问题的任何人:

    我的错误来自我使用的事实:

    ABMultiValueCopyValueAtIndex 带有标识符而不是索引。

    您必须调用ABMultiValueGetIndexForIdentifier,然后在ABMultiValueCopyValueAtIndex 上使用该索引。

    底线是Identifier!=index

    【讨论】:

      【解决方案3】:

      而不是使用

      ABMultiValueCopyValueAtIndex(multiValue, identifier);

      上面提到的Zebs,使用...

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多