2012-04-09 4 views
1

코드를 따르는 프로젝트를 분석 할 때 누출 경고가 나옵니다. 내 메모리 누수 문제를 해결할 방법이 있습니까?아이폰에 할당 된 객체의 잠재 누출

경고 :

Potential leak of an object allocated on line 38 and stored into 'addressBook' 

우는 소리가 내 코드입니다. ADV에서

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    m_tableDataArray = [[[NSMutableArray alloc] init]autorelease]; 
    NSMutableArray *listDate = [[[NSMutableArray alloc] init]autorelease]; 
    ABAddressBookRef addressBook = ABAddressBookCreate(); 
    NSArray *addresses = (NSArray *) ABAddressBookCopyArrayOfAllPeople(addressBook); 
    NSInteger addressesCount = [addresses count]; 
    for (int i = 0; i < addressesCount; i++) { 
     ABRecordRef record = [addresses objectAtIndex:i]; 
     NSString *firstName = (NSString *)ABRecordCopyValue(record, kABPersonFirstNameProperty); 
     NSString *lastName = (NSString *)ABRecordCopyValue(record, kABPersonLastNameProperty); 
     if(firstName != nil && lastName != nil){ 
      NSString *contactFirstLast = [NSString stringWithFormat: @"%@ %@", firstName, lastName]; 
      [listDate addObject:contactFirstLast]; 
     } 
     [firstName release]; 
     [lastName release]; 
    } 
    m_tableDataArray = [[NSArray arrayWithArray:listDate] retain]; 
    [addresses release]; 
    addresses = nil; 
    [m_mainTable reloadData]; 
} 

감사합니다 ... 당신은 당신이 사용을 해제 할 필요가 addressBook를 사용하여 완료되면

+0

작성/복사 한 내용은 모두 릴리스해야합니다. 이 경우 ABAdressBookCreate()가 주소록 참조를 만들고 있는데 어디서든 공개하지 않습니다. – EmilioPelaez

+0

당신은 내가이 물체를 출시해야한다는 것을 의미합니까? 'ABAddressBookRef addressBook = ABAddressBookCreate(); ' –

+0

코드를 설명해주세요. 남자'주소록이란 무엇입니까? 어떤 사람은 당신을 도울 수 있습니다 – Ayaz

답변

6

은 :

CFRelease(addressBook); 

이것은 아마 당신의 viewWillAppear: 방법의 끝에 배치해야합니다.

업데이트 :viewWillAppear: 버전에는 몇 가지 불필요한 배열과 단계가 있습니다. 나는 이것을 조금 닦아 잠재적 메모리 누출을 고쳤다.

참고 : 실제로 이것을 올바르게 실행했는지 다시 확인하지 않았습니다.

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    // I assume m_tableDataArray is an instance variable. If so, if the 
    // view appears multiple times it will result in a leak unless we 
    // release pre-existing instances first. 

    [m_tableDataArray release], m_tableDataArray = nil; 
    m_tableDataArray = [[NSMutableArray alloc] init]; 

    ABAddressBookRef addressBook = ABAddressBookCreate(); 

    NSArray *addresses = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook); 

    for (ABRecordRef record in addresses) { 
     NSString *firstName = (NSString *)ABRecordCopyValue(record, kABPersonFirstNameProperty); 
     NSString *lastName = (NSString *)ABRecordCopyValue(record, kABPersonLastNameProperty); 

     if(firstName != nil && lastName != nil){ 
      NSString *contactFirstLast = [NSString stringWithFormat: @"%@ %@", firstName, lastName]; 
      [m_tableDataArray addObject:contactFirstLast]; 
     } 

     [firstName release]; 
     [lastName release]; 
    } 

    [addresses release], addresses = nil; 
    CFRelease(addressBook); 

    [m_mainTable reloadData]; 
} 
+0

생명의 은인 ..... 슈퍼 대답 주셔서 감사합니다 .... –

관련 문제