2012-04-09 2 views
1

Когда я анализирую свой проект, следующий код дает мне предупреждение о утечке. есть ли способ решить проблему утечки памяти?Потенциальная утечка объекта, выделенного в iphone

предупреждение:

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

пыльник мой код.

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

Спасибо айу ...

+0

Вам необходимо освободить все, что вы создадите/скопируете. В этом случае ABAdressBookCreate() создает адресную книгу, и вы нигде не выпускаете ее. – EmilioPelaez

+0

Вы имеете в виду этот объект, который я должен отпустить? 'ABAddressBookRef addressBook = ABAddressBookCreate();' –

+0

объясните свой код Men's Что такое адресная книга, запись Что-то вроде этого. то кто-то может вам помочь – Ayaz

ответ

6

После того, как вы закончили использовать addressBook вам нужно освободить его с помощью:

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

спасатель ..... спасибо за супер ответ .... –

Смежные вопросы