Утечка памяти при выделении NSObject - PullRequest
0 голосов
/ 23 марта 2010

Привет, я получаю утечку памяти при выделении NSObject, т.е.

ContactDTO* contactDTO = [[ContactDTO alloc] init];

Код:

+(ContactDTO*) getContactDTOForId:(NSString*) contactId
{
NSString* homeMail =@"";
NSString* workMail=@"";


NSString *lastNameString=@""; 
NSString *firstNameString=@"";

firstNameString = [AddressBookUtil getValueForProperty:kABPersonFirstNameProperty forContact:contactId];
lastNameString = [AddressBookUtil getValueForProperty:kABPersonLastNameProperty forContact:contactId];

ABRecordID contactIntId = [contactId intValue];
ABRecordRef person =   ABAddressBookGetPersonWithRecordID(addressBook, contactIntId);
ABMultiValueRef emailMultiValue =(NSString *)ABRecordCopyValue(person, kABPersonEmailProperty);
for(CFIndex j=0;j<ABMultiValueGetCount(emailMultiValue);j++)
{
    NSString* curentTypeLabel =(NSString *)ABMultiValueCopyLabelAtIndex(emailMultiValue,j);

    if([curentTypeLabel isEqualToString:@"_$!<Home>!$_"]==YES)
    {
        NSString* currentEmail =(NSString *)ABMultiValueCopyValueAtIndex(emailMultiValue,j);
        if([currentEmail isEqualToString:nil]==NO)
        {
            homeMail = [currentEmail copy];
        }
    }
    if([curentTypeLabel isEqualToString:@"_$!<Work>!$_"]==YES)
    {
        NSString* currentEmail =(NSString *)ABMultiValueCopyValueAtIndex(emailMultiValue,j);
        if([currentEmail isEqualToString:nil]==NO)
        {
            workMail = [currentEmail copy];
        }
    }
}

ContactDTO* contactDTO = [[ContactDTO alloc] init];
contactDTO.firstName = firstNameString;
contactDTO.lastName = lastNameString;
contactDTO.contactId = contactId;
contactDTO.homeEmail = homeMail;
contactDTO.workEmail = workMail;

return [contactDTO autorelease];
}

Ответы [ 2 ]

1 голос
/ 23 марта 2010

Вы опубликовали три почти идентичных вопроса, касающихся утечек памяти.Возможно, вам будет полезно прочитать Руководство по программированию управления памятью Apple .

1 голос
/ 23 марта 2010

При чтении адресов электронной почты из адресной книги вы используете ABMultiValueCopyValueAtIndex(), который возвращает ссылку, которая принадлежит вам (например, должна быть выпущена с использованием CFRelease() вами), как и [obj copy];.

Я предполагаю, что вы освобождаете homeMail и workMail в вашем методе dealloc, но скопированное значение из адресной книги, похоже, просочилось в этом методе.

...