2012-05-12 10 views
0

ビルドと分析を使用すると、リークが発生しました(オブジェクトの潜在的なリークとして示されました)。それを修正するには以下を含むFixオブジェクトの潜在的なリーク

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

私のアプリはクラッシュします。

だから、plsはどこに漏れてそれを解決するか教えてくれます。

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

使用する - あなたがaContactNameにaContactLastNameを割り当てるこれで

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をリリースしています。

if (aContactLastName){ 
       CFRelease(aContactLastName); 
       } 

、その後、あなたは、これは間違っている(aContactNameがすでに解放されて) return aContactName;を戻ってきています。

コードから

if (aContactLastName){ 
       CFRelease(aContactLastName); 
       } 

を削除して答えを[aContactName autorelease];

関連する問題