2010-03-23 55 views
0

HI,我正在逐渐NSObject的分配,即内存泄漏,内存泄漏在NSObject的分配

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

代码:

+(ContactDTO*) getContactDTOForId:(NSString*) contactId 
{ 
NSString* homeMail [email protected]""; 
NSString* [email protected]""; 


NSString *[email protected]""; 
NSString *[email protected]""; 

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]; 
} 

回答

1

当从地址簿读取电子邮件地址使用ABMultiValueCopyValueAtIndex()返回由您拥有的参考资料(例如必须由您使用CFRelease()发布),[obj copy];也一样。

我假设你在你的dealloc方法中释放homeMailworkMail,但是来自地址簿的复制值似乎在这种方法中泄漏。

+0

我完成了它作为你的建议,但仍然进出内存泄漏在同一个地方。你给任何其他建议,摆脱这? – 2010-03-23 12:39:35

+0

第二次查看您的示例后,我发现您正在执行的'[currentEmail copy]'也是开销,只是将它们分配给它们(例如'workMail = currentEmail;')。但是我同意Isaac的观点,你应该明确地阅读“内存管理编程指南”,因为这些主题都包含在那里。 – Alfonso 2010-03-24 07:34:47