2012-12-26 65 views
2

這是我的代碼,運行最後一行CFRelease(addressBook),程序崩潰!幫我〜!調用CFRelease時崩潰(ABAddressBookRef ref)

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

回答

5

您不擁有obj_pobj_g,因此當您釋放其橋接引用並超出該枚舉塊時,它們會被過度釋放。如果您使用CreateCopy訪問它們,則只擁有核心基礎對象。

+1

我明白了,'obj_p'和'obj_g'不是由我創建或複製的,所以當釋放'addressBook'的時候通過釋放它們來崩潰。謝謝〜 – hpyhacking