Sigsegv在使用AddressBookUI框架时崩溃

时间:2013-09-21 09:19:29

标签: ios iphone sigsegv abpersonviewcontroller abmultivalue

嗨我在崩溃日志中有一个我无法理解的错误:

Incident Identifier: A0DFD1F1-8CB5-4D97-B19C-F73438F50136
CrashReporter Key:   [TODO]
Hardware Model:      iPhone4,1
Process:         Rubrica4146 [1163]
Path:            /var/mobile/Applications/A8BF5FB7-C32B-4A8C-A7AA-E6F6D94DF2EB/Rubrica4146.app/Rubrica4146
Identifier:      com.7shapes.rubrica4146
Version:         27
Code Type:       ARM
Parent Process:  launchd [1]

Date/Time:       2013-09-20 15:38:31 +0000
OS Version:      iPhone OS 7.0 (11A465)
Report Version:  104

Exception Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0xc0000004
Crashed Thread:  0

Thread 0 Crashed:
0   CoreFoundation                      0x303b004c CFRetain + 8
1   Rubrica4146                         0x000ce3d3 -[AppDelegate personViewController:shouldPerformDefaultActionForPerson:property:identifier:] (AppDelegate.m:752)
2   AddressBookUI                       0x2fb61385 -[ABPersonViewController_Modern contactViewController:shouldPerformDefaultActionForContact:property:labeledValue:] + 177
3   AddressBookUI                       0x2faf0133 -[ABContactViewController tableView:didSelectRowAtIndexPath:] + 659
4   UIKit                               0x32d1032b -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1079
5   UIKit                               0x32dc3253 -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 215
6   UIKit                               0x32c73971 _applyBlockToCFArrayCopiedToStack + 317
7   UIKit                               0x32beb473 _afterCACommitHandler + 431
8   CoreFoundation                      0x3044d1d5 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 21
9   CoreFoundation                      0x3044ab79 __CFRunLoopDoObservers + 285
10  CoreFoundation                      0x3044aebb __CFRunLoopRun + 731
11  CoreFoundation                      0x303b5ce7 CFRunLoopRunSpecific + 523
12  CoreFoundation                      0x303b5acb CFRunLoopRunInMode + 107
13  GraphicsServices                    0x350d6283 GSEventRunModal + 139
14  UIKit                               0x32c57a41 UIApplicationMain + 1137
15  Rubrica4146                         0x000ca6af main (main.m:16)

这是似乎生成它的方法:

-(BOOL) personViewController:(ABPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{
    if (property == kABPersonPhoneProperty){
        NSString *number = nil;
        ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, property);
        if (ABMultiValueGetCount(phoneNumbers) > 0) {
            number = (__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(phoneNumbers, identifier);
            [self setInfoForPersonToCall:person];
            self.numberToSave = number;
            self.numberToCall = number;
            if (self.shouldSendSMS) {
                [self prepareToSMSNumber];
            } else {
                [self prepareToCallNumber];
            }
        }
        if (phoneNumbers != nil)
            CFRelease(phoneNumbers);
    }
    return NO;
}

有人知道如何修复它吗? 我相信ARC内存管理和__bridge_transfer存在问题。 感谢

1 个答案:

答案 0 :(得分:0)

尝试使用kABPersonPhoneProperty迭代联系人的电话号码(CFBridgingRelease多值):

// Access the person's phone numbers (an ABMultiValueRef)
ABMultiValueRef phoneProperty = ABRecordCopyValue(person, kABPersonPhoneProperty);

if (phoneProperty)
{
    // Iterate through the phone multivalue
    for (CFIndex index = 0; index < ABMultiValueGetCount(phoneProperty); index++)
    {
        // Get the phone identifier for this phone property
        ABMultiValueIdentifier phoneIdentifier = ABMultiValueGetIdentifierAtIndex(phoneProperty, index);

        // Get the phone number
        NSString *phoneNumber = CFBridgingRelease(ABMultiValueCopyValueAtIndex(phoneProperty, index));
    }
}