2013-08-07 52 views
1

更新:崩潰的第二通訊錄(聯繫人)查找

我認爲問題的關鍵在於我如何儲存參考ABRecordRef地方。我目前只是將價值掛在peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:而不是CFRetain或其他東西上。目前還不清楚該文件是否需要保留。


我正在研究一個iPhone應用程序,它使用AddressBook和AddressBookUI框架與地址簿連接。我正在使用ABPeoplePickerNavigationController向用戶顯示聯繫人列表以供選擇,並將結果ABRecordRef作爲實例變量捕獲到自定義類中。

這一切都工作正常的第一次使用。但是,當我從聯繫人(即使是另一個人)挑選某人時,,我的應用在撥打ABRecordCopyValue致電EXC_BAD_ACCESS。我記錄指針,每次選擇一個聯繫人時(即使是兩次相同的聯繫人),它們也是完全不同的。

我不明白這個引用是如何被釋放的。內存泄漏肯定,但爲什麼它第一次正常工作,而不是第二次?

這裏的實際調用它的死在:

- (NSString*)displayName { 
    return CFBridgingRelease(ABRecordCopyValue(self.contact, kABPersonFirstNameProperty)); 
} 

這裏的一些調試輸出,如果它可以幫助我們在所有:

Printing description of self->_contact: 
(ABRecordRef) _contact = 0x1f582dc0 

(lldb) expr (CFTypeRef)ABRecordCopyValue(self.contact, kABPersonFirstNameProperty) 
error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=1, address=0xd1f57cc1). 
The process has been returned to the state before execution. 

回答

0
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker 
     shouldContinueAfterSelectingPerson:(ABRecordRef)person 
{ 
    [self displayPerson:person]; 
    [self dismissViewControllerAnimated:YES completion:nil]; 

    return NO; 
} 

你沒有返回?

嘗試檢查,看看是否存在價值也許

- (void)displayPerson:(ABRecordRef)person 
{ 
    NSString* companyName = (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonOrganizationProperty); 
    NSString* name = (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty); 
    NSString* display = @""; 

    if (companyName) { 
     display = companyName; 
    } else if (name) { 
     display = name; 
    } else { 
     UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"No Details For Contact" 
                  message:@"Please update contact with company and/or first name" 
                  delegate:nil 
                cancelButtonTitle:@"Dismiss" 
                otherButtonTitles:nil]; 
     [alertView show]; 
    } 
} 
+0

是的,我正在返回'NO'。 – devios1

1

打開了所有我需要的是CFRetain(person),一切的幸福着呢幸運。我還添加了dealloc我上課的時候物體消失清理指針:

- (void)dealloc { 
    CFRelease(_contact); 
} 

我的代碼現在運行平穩靜態分析是幸福的(不在於它抓住了泄漏反正)。

相關問題