2010-03-23 107 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