2012-05-12 129 views
0

当我使用构建和分析时,我得到了泄漏(它显示为对象的潜在泄漏)。以解决我包括如下修复对象的潜在泄漏

if (aContactfirstName){ 
    CFRelease(aContactfirstName); 
    } 
if (aContactLastName){ 
    CFRelease(aContactLastName); 
    } 

但我的应用程序崩溃。

请让我知道它在哪里泄漏并解决它。

-(NSString*)getContactNameByPhoneNo:(NSString*)phoneNO{ 

     NSString *aContactName = phoneNO; 
     ABAddressBookRef addressbook = ABAddressBookCreate(); 
     CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressbook); 
     CFIndex numPeople = ABAddressBookGetPersonCount(addressbook); 
     for (int i=0; i < numPeople; i++) { 
     ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i); 
     ABMutableMultiValueRef phonelist = ABRecordCopyValue(person, kABPersonPhoneProperty); 
     CFIndex numPhones = ABMultiValueGetCount(phonelist); 

     for (int j=0; j < numPhones; j++) { 
      CFTypeRef ABphone = ABMultiValueCopyValueAtIndex(phonelist, j); 
      NSString *personPhone = (NSString *)ABphone; 
      NSLog(@"i am:"); 
      personPhone =[personPhone stringByReplacingOccurrencesOfString:@"-"withString:@""]; 
      personPhone=[personPhone stringByReplacingOccurrencesOfString:@")"withString:@""]; 
      personPhone=[personPhone stringByReplacingOccurrencesOfString:@" "withString:@""]; 
      personPhone=[personPhone stringByReplacingOccurrencesOfString:@"("withString:@""]; 
      personPhone=[personPhone stringByReplacingOccurrencesOfString:@"+"withString:@""]; 
      NSLog(@"xcxcxcxc"); 

      CFRelease(ABphone); 

      if ([personPhone isEqualToString:phoneNO]){ 
      NSString *aContactfirstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty) ; 
      NSString *aContactLastName = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty) ; 
      if (aContactLastName != NULL && aContactfirstName != NULL){ 
       aContactName = [NSString stringWithFormat:@"%@ %@",aContactfirstName,aContactLastName]; 
      } 
      else if(aContactfirstName != NULL){ 
       aContactName = aContactfirstName; 
      } 
      else if(aContactLastName != NULL){ 
       aContactName = aContactLastName; 
      } 

       if (aContactfirstName){ 
       CFRelease(aContactfirstName); 
       } 
       if (aContactLastName){ 
       CFRelease(aContactLastName); 
       } 

      break; 
      } 
     } 
     CFRelease(phonelist); 
     } 
     CFRelease(allPeople); 
     CFRelease(addressbook); 
     return aContactName; 
    } 

回答

0

使用 -

NSString *aContactfirstName = [(NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty) autorelease]; 
NSString *aContactLastName = [(NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty) autorelease]; 
+0

非常感谢提供答案 – user198725878

0
if(aContactLastName != NULL){ 
       aContactName = aContactLastName;//aContactName pointing to aContactLastName 
      } 

在此要指定aContactLastName到aContactName(aContactLastName和aContactName都指向同一个内存位置)。之后您将发布一个ContactContactName。

if (aContactLastName){ 
       CFRelease(aContactLastName); 
       } 

,然后你正在返回return aContactName;(aContactName已经释放) 这是错误的。

从代码中删除

if (aContactLastName){ 
       CFRelease(aContactLastName); 
       } 

,并返回[aContactName autorelease];