2011-04-01 52 views
0

有人可以告诉我为什么这个代码泄漏?仪器显示出几处泄漏,我无法弄清楚为什么,我经历了几次代码?为什么这个代码泄漏这么多?

基本上,第一种方法从属性列表初始化一堆缩略图类,然后构建一个用作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; 
    } 
} 
+0

,你有一个viewDidUnload和一个dealloc? – 2011-04-01 18:37:41

回答

2

tempThumbsArray变量未在此行后发布changeDatasourceToSection:

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

这意味着你想添加一个“[tempThumbsArray release];”在函数结束时。 – 2011-04-01 18:59:40

+0

或者只是使用'NSMutableArray * tempThumbsArray = [NSMutableArray数组];' – 2011-04-01 19:05:06