Может кто-нибудь сказать мне, почему этот код протекает?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;
}
}