Утечки памяти iPhone ABPeoplePickerNavigationController

Я просматриваю свое приложение, уничтожая все утечки памяти, и инструмент анализа обнаруживает утечку с помощью abpeoplepickernavigationcontroller.

Я так понимаю, это как-то связано с методом копирования? но не знаю, как его выпустить, где и во время записи.

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

-(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;

}

Спасибо


person MrPink    schedule 23.08.2011    source источник


Ответы (1)


Проблема скорее всего здесь:

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

Вы получаете копии объектов с ABRecordCopyValue и ABMultiValueCopyValueAtIndex, но они не освобождаются.

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);
}
person Jilouc    schedule 23.08.2011
comment
Совершенно верно, нужен CFRelease. Досадно, что похоже, что ABPeoplePickerNavigationController сам по себе дает утечку. - person Rob; 30.05.2012