Я получаю EXC_BAD_ACCESS при вызове ABAddressBookRemoveRecord - PullRequest
0 голосов
/ 23 марта 2012

У меня есть следующий метод получения контактов из адресной книги:

- (void) scanAddressBook
{

NSUInteger i;
NSUInteger k;

ABAddressBookRef addressBook = ABAddressBookCreate();
NSArray *people = (__bridge_transfer NSArray *) ABAddressBookCopyArrayOfAllPeople(addressBook);

if ( people==nil )
{
    NSLog(@"NO ADDRESS BOOK ENTRIES TO SCAN");
    CFRelease(addressBook);
    return;
}

for ( i=0; i<[people count]; i++ )
{
    ABRecordRef person = (__bridge ABRecordRef)[people objectAtIndex:i];
    NSNumber *recordID = [NSNumber numberWithUnsignedInt:ABRecordGetRecordID(person)];

    ABMutableMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty);
    NSString *name = [NSString stringWithFormat:@"%@ %@",
                      (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty),
                      (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty)];



    CFIndex phoneNumberCount = ABMultiValueGetCount( phoneNumbers );
    NSMutableArray *arrPhoneNumbers = [[NSMutableArray alloc] initWithCapacity:phoneNumberCount];

    for ( k=0; k<phoneNumberCount; k++ )
    {
        CFStringRef phoneNumberLabel = ABMultiValueCopyLabelAtIndex( phoneNumbers, k );
        NSString *phoneNumberValue = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex( phoneNumbers, k );
        CFStringRef phoneNumberLocalizedLabel = ABAddressBookCopyLocalizedLabel( phoneNumberLabel );


        [arrPhoneNumbers addObject:phoneNumberValue];

        CFRelease(phoneNumberLocalizedLabel);
        CFRelease(phoneNumberLabel);
    }

    NSMutableDictionary *dictPerson = [[NSMutableDictionary alloc] init];
    [dictPerson setObject:name forKey:@"contactName"];
    [dictPerson setObject:arrPhoneNumbers  forKey:@"phoneNumbers"];
    [dictPerson setObject:recordID forKey:@"recordID"];

    [arrABFriends addObject:dictPerson];
}

CFRelease(addressBook);
}

Позже, в следующем представлении, у меня есть возможность удалить выбранную запись, и это выглядит так:

-(IBAction) removeContactFromAB
{
ABAddressBookRef addressBook; 
CFErrorRef error = NULL; 
addressBook = ABAddressBookCreate(); //
CFRetain(addressBook);
ABRecordID recordID = (ABRecordID)[[personToDump objectForKey:@"recordID"] integerValue];
NSLog(@"recordID: %d", recordID);
//    ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook,(ABRecordID)recordID);
ABRecordRef person = ABAddressBookGetGroupWithRecordID(addressBook, recordID);
//fullName.text = (NSString *)ABRecordCopyCompositeName((ABRecordRef)person);

ABAddressBookRemoveRecord( addressBook, person, &error );

if(error !=NULL)
{
    UIAlertView    *alert =[[UIAlertView alloc] initWithTitle:@"error" message:@"deleting" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"OK",nil];
    [alert show];        
}

ABAddressBookSave(addressBook, &error);
NSLog(@"ERROR: %@", &error);
CFRelease(addressBook);

}

Я пытался передать ABRecordRef & ABRecordID к следующему представлению, но в обоих случаях у меня было EXC_BAD_ACCESS на ABAddressBookRemoveRecord (addressBook, person & & error).

Ответы [ 2 ]

2 голосов
/ 27 марта 2012

Ваш ABAddressBookGetGroupWithRecordID (addressBook, recordID) возвращал что-то отличное от NULL?

У меня та же проблема, я думаю, и проблема где-то в разговоре об идентификаторах записей.Если вы попробуете

NSNumber *recordID=[NSNumber numberWithUnsignedInt:ABRecordGetRecordID(person)];
ABRecordID recordID2 =(ABRecordID) recordID2; 
ABAddressBookGetGroupWithRecordID(addressBook, recordID2)

, он также вернет значение null.Я не уверен, как решить эту проблему.

ui .: Я хотел добавить это в комментарии, но оказалось, что у меня еще недостаточно представителей: (* ​​1008 *

1 голос
/ 24 мая 2012

Проблема заключалась в том, что я пытался получить ссылку из группы с идентификатором из ссылки, и я получал ноль в качестве ссылки, а позже пытался найти запись с нулем ссылки.Вот где мое приложение давало EXC_BAD_ACCESS.

Поэтому вместо:

ABRecordRef person = ABAddressBookGetGroupWithRecordID(addressBook, recordID);

Там должно быть:

ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook, recordID);
...