2

This's my code, run the last line CFRelease(addressBook), program crash! help me~!

ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);

NSMutableArray *groups = [NSMutableArray arrayWithCapacity:ABAddressBookGetGroupCount(addressBook)];
NSMutableArray *people = [NSMutableArray arrayWithCapacity:ABAddressBookGetGroupCount(addressBook)];

[(NSArray *)CFBridgingRelease(ABAddressBookCopyArrayOfAllGroups(addressBook)) enumerateObjectsUsingBlock:^(id obj_g, NSUInteger idx, BOOL *stop) {
    ABRecordRef g = (__bridge ABRecordRef)obj_g;
    NSString *gname = CFBridgingRelease(ABRecordCopyCompositeName(g));

    NSMutableArray *gp = [[[NSArray alloc] init] mutableCopy];

    [(NSArray *)CFBridgingRelease(ABGroupCopyArrayOfAllMembers(g)) enumerateObjectsUsingBlock:^(id obj_p, NSUInteger idx, BOOL *stop) {
        ABRecordRef p = (__bridge ABRecordRef)obj_p;
        ABMultiValueRef numbers = ABRecordCopyValue(p, kABPersonPhoneProperty);

        NSString *pname = CFBridgingRelease(ABRecordCopyCompositeName(p));

        [(NSArray *) CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(numbers)) enumerateObjectsUsingBlock:^(id obj_n, NSUInteger idx, BOOL *stop) {
            NSString *pnumber = CFBridgingRelease(CFBridgingRetain(obj_n));

            MasMsContact *new_c = [[MasMsContact alloc] init];
            new_c.name = pname;
            new_c.number = pnumber;
            new_c.group = gname;

            [gp addObject:new_c];
        }];

        CFRelease(numbers);
        CFRelease(p);
    }];

    CFRelease(g);

    [people addObject:[gp copy]];
    [groups addObject:gname];
}];

#warning crash when release addressBook, why ???
if (addressBook) CFRelease(addressBook);

Xcode when crash

hpyhacking
  • 285
  • 3
  • 14

2 Answers2

5

You don't own obj_p or obj_g so they're being overreleased when you release their bridged references and then pop out of that enumeration block. You only own core foundation objects if you access them using a Create or Copy.

Jack Lawrence
  • 10,664
  • 1
  • 47
  • 61
  • 1
    I got it, `obj_p` and `obj_g` not create or copy by me, so crash by release them when release `addressBook`. thank you ~ – hpyhacking Dec 26 '12 at 05:22
0

I'm google this iPhone SDK: EXC_BAD_ACCESS with CFRelease for ABAddressBookRef

I have same problem, over release g and p.

Community
  • 1
  • 1
hpyhacking
  • 285
  • 3
  • 14