Почему этот код протекает так много? - PullRequest
0 голосов
/ 01 апреля 2011

Может кто-нибудь сказать мне, почему этот код протекает?Instruments показывает несколько утечек, и я не могу понять, почему, и я просмотрел код несколько раз?

По сути, первый метод инициализирует набор классов Thumbnail из списка свойств, а затем создает массив, который используется в качестве источника данных tableviews.Второй метод обновляет источник данных tableviews при выборе нового раздела:

Вот вызовы инициализации и dealloc:

NSMutableArray *thumbnailsDatasource;   
NSMutableDictionary *sectionsDictionary;

@property (nonatomic, retain) NSMutableArray *thumbnailsDatasource;
@property (nonatomic, retain) NSMutableDictionary *sectionsDictionary;
@synthesize thumbnailsDatasource;
@synthesize sectionsDictionary;

[thumbnailsDatasource release], thumbnailsDatasource = nil; 
[sectionsDictionary release], sectionsDictionary = nil;

А вот два метода, вызывающих утечку:

- (void)initThumbnails
{
    // init sections dictionary
    NSMutableDictionary *sectionsDict = [[NSMutableDictionary alloc] init];

    // read the cover data from the plist
    NSString *thePath = [[NSBundle mainBundle]  pathForResource:kThumbnailPlistName ofType:@"plist"];
    NSArray *thumbsArray = [[NSArray alloc] initWithContentsOfFile:thePath];

    // iterate over the values in the dictionary
    for (NSDictionary *currentThumb in thumbsArray)
    {
        Thumbnail *newThumb = [[Thumbnail alloc] initWithName:[currentThumb objectForKey:kThumbnailName]
                                                      fileURL:[currentThumb objectForKey:kThumbnailFileURL]
                                                     imageURL:[currentThumb objectForKey:kThumbnailImageURL]
                                                      section:[currentThumb objectForKey:kThumbnailSection]
                                                   pageNumber:[(NSNumber*)[currentThumb objectForKey:kThumbnailPageNumber] integerValue]];

        // check if we already have an array in sectionsDictionary for that section
        if ([sectionsDict objectForKey:newThumb.section]) 
        {       
            NSMutableArray *currentSectionArray = [sectionsDict objectForKey:newThumb.section];
            [currentSectionArray addObject:newThumb];
        }
        else 
        {
            NSMutableArray *newSectionArray = [[NSMutableArray alloc] init];
            [newSectionArray addObject:newThumb];

            [sectionsDict setObject:newSectionArray forKey:newThumb.section];
            [newSectionArray release], newSectionArray = nil;
        }       
        [newThumb release], newThumb = nil;
    }

    [thumbsArray release], thumbsArray = nil;

    self.sectionsDictionary = sectionsDict;
    [sectionsDict release], sectionsDict = nil;


    NSMutableArray *tempThumbsArray = [[NSMutableArray alloc] init];

    // set datasource to All sections in dictionary
    NSArray *allValuesArray = [self.sectionsDictionary allValues];

    for (NSMutableArray *currentSection in allValuesArray)
    {
        [tempThumbsArray addObjectsFromArray:currentSection];
    }

    // sort array by pageNumber asc
    [tempThumbsArray sortUsingSelector:@selector(comparePageNumberAsc:)];
    self.thumbnailsDatasource = tempThumbsArray;

    [tempThumbsArray release], tempThumbsArray = nil;

}

- (void)changeDatasourceToSection:(NSString*)section
{

    if ([section isEqualToString:kAllSectionsName]) {

        NSMutableArray *tempThumbsArray = [[NSMutableArray alloc] init];

        // set datasource to All sections in dictionary
        NSArray *allValuesArray = [self.sectionsDictionary allValues];

        for (NSMutableArray *currentSection in allValuesArray)
        {
            [tempThumbsArray addObjectsFromArray:currentSection];
        }

        // sort array by pageNumber asc
        [tempThumbsArray sortUsingSelector:@selector(comparePageNumberAsc:)];
        self.thumbnailsDatasource = tempThumbsArray;

    }
    else {
        NSMutableArray *newDatasource = (NSMutableArray*)[self.sectionsDictionary objectForKey:section];
        [newDatasource sortUsingSelector:@selector(comparePageNumberAsc:)];
        self.thumbnailsDatasource = newDatasource;
    }
}

1 Ответ

2 голосов
/ 01 апреля 2011

Переменная tempThumbsArray не освобождается после этой строки в changeDatasourceToSection:

NSMutableArray *tempThumbsArray = [[NSMutableArray alloc] init];
...