Утечка NSCFArray в распределении NSMutablearray - PullRequest
1 голос
/ 23 марта 2010

Я получаю утечку при этом распределении

filteredListContent = [[NSMutableArray alloc] initWithCapacity:[showList count]];

КОД:

-(void)reloadTable
{
    EventListAppDelegate *appDelegate;
    UIApplication app = [UIApplication sharedApplication];
    appDelegate = (EventListAppDelegate *)[app delegate];

    contactList = [appDelegate getAllContactsList];
    inviteeList = [appDelegate getInviteeListForEvent:event.primaryKey];

    if (isInvited == YES)
    {
        showList = [appDelegate getInviteeListForEvent:event.primaryKey];
    }
    else
    {
        showList = [appDelegate getAllContactsList];
    }

    filteredListContent = [[NSMutableArray alloc] initWithCapacity:
                           [showList count]];

    [filteredListContent addObjectsFromArray: showList];

    [self organizeContactItemsIntoIndexes];
    self.title = [event.name capitalizedString];

    [self getToolbar];        
    [theTableView reloadData];
}

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    [filteredListContent removeAllObjects]; 

    ContactDTO *currentElement;
    NSRange range;

    for (currentElement in showList)
    {
        range = [currentElement.lastName rangeOfString:searchText
                                         options:NSCaseInsensitiveSearch];

        if(range.location == 0)
        {
            [filteredListContent addObject:currentElement];
        }
    }

    [self organizeContactItemsIntoIndexes];
    [theTableView reloadData];
}

- (void)dealloc
{
    [filteredListContent release];
    [super dealloc];
}

Ответы [ 2 ]

3 голосов
/ 23 марта 2010

Ваш код будет выделять новый экземпляр filteredListContent каждый раз, когда вызывается reloadTable, что обычно происходит несколько раз в течение жизненного цикла вашего приложения.Это приводит к утечке, поскольку старые экземпляры не освобождаются.

Лучший (и самый простой) способ исправить это было бы сделать свойство filteredListContent a retain:

в заголовке вашего класса:

@property (nonatomic, retain) NSMutableArray * filteredListContent;

в вашем методе reloadTable:

self.filteredListContent = [NSMutableArray arrayWithCapacity:[showList count]];

Примечаниеиспользование self. во втором фрагменте кода.Этот синтаксис информирует Cocoa о том, что он должен использовать средство доступа к свойству для установки значения filteredListContent, которое затем отправит вам соответствующие сообщения retain и release.

0 голосов
/ 23 марта 2010

Вы опубликовали три почти идентичных вопроса, касающихся утечек памяти. Возможно, вам будет полезно прочитать Руководство по программированию управления памятью Apple .

...