2011-08-23 166 views
0

我正在通過我的應用程序查殺所有內存泄漏,分析工具使用abpeoplepickernavigationcontroller發現泄漏。iPhone ABPeoplePickerNavigationController內存泄漏

我知道這是與複製方法有關嗎?但不知道如何在寫入時間和地點釋放它。

我基本上需要呈現模態視圖,選擇phonenumber然後將其拖回文本框。我的繼承人代碼

-(IBAction)openAddressBook{ 

    ABPeoplePickerNavigationController *peoplepicker = [[ABPeoplePickerNavigationController alloc] init]; 

    peoplepicker.peoplePickerDelegate = self; 
    [self presentModalViewController:peoplepicker animated:YES]; 
    [peoplepicker release]; 

} 

- (void)peoplePickerNavigationControllerDidCancel: 

(ABPeoplePickerNavigationController *)peoplePicker { 

    [self dismissModalViewControllerAnimated:YES]; 

} 

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker 
     shouldContinueAfterSelectingPerson:(ABRecordRef)person 
{ 
    return YES; 
} 

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker 
     shouldContinueAfterSelectingPerson:(ABRecordRef)person 
           property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier 
{ 


    //Retrieving the phone number property of ABRecordRef 

    ABMultiValueRef phoneProperty = ABRecordCopyValue(person, property); 
    NSString *phone = (NSString *)ABMultiValueCopyValueAtIndex(phoneProperty, identifier); 
    phone = [phone stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
    NSArray *brokenNumber = [phone componentsSeparatedByString:@" "]; 
    phone = [brokenNumber componentsJoinedByString:@""]; 

    if(![phonenumber.text isEqualToString:@""]) 
     phonenumber.text = [NSString stringWithFormat:@"%@%@", phonenumber.text, @";"]; 
    phonenumber.text = [NSString stringWithFormat:@"%@%@", phonenumber.text, phone]; 

    [self dismissModalViewControllerAnimated:YES]; 
    return NO; 

} 

感謝

回答

2

的問題很可能是在這裏:

ABMultiValueRef phoneProperty = ABRecordCopyValue(person, property); 
NSString *phone = (NSString *)ABMultiValueCopyValueAtIndex(phoneProperty, identifier); 
phone = [phone stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

你得到的對象副本ABRecordCopyValueABMultiValueCopyValueAtIndex,他們都沒有公佈。

ABMultiValueRef phoneProperty = ABRecordCopyValue(person, property); 
NSString *phone = (NSString *)ABMultiValueCopyValueAtIndex(phoneProperty, identifier); 
if (phoneProperty) { 
    CFRelease(phoneProperty); 
} 

NSString *trimmedPhone = [phone stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
if (phone) { 
    CFRelease(phone); 
} 
+0

絕對正確,需要CFRelease。煩人的是,它看起來像ABPeoplePickerNavigationController本身就是泄漏。 – Rob