В моем приложении у меня есть соединение с базой данных sqlite3. Я сделал класс-оболочку, в этом классе-оболочке у меня есть NSMutableDictionary и NSMutableArray.
Каждый раз, когда выполняется запрос I removeAllObjects
из диктонары и массива в классе рэпера (я его не освобождаю). Затем я добавляю результаты запроса в массив и словарь. Словарь содержит еще один подсловарь.
У меня есть tableViewController, в этом классе я получаю данные из базы данных, используя мой класс рэпера, и копирую их в мою переменную tableviewcontroller:
.h
@interface BrandViewController : UIViewController
<UITableViewDataSource , UITableViewDelegate>
{
FairPriceDatabaseView *FairPriceDB;
NSArray *brandsIDs;
NSMutableDictionary *brandsRecords;
UITableView *tableView;
}
.m
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self loadBrandsIDs];
[tableView reloadData];
}
- (void)dealloc {[brandsRecords release];
[brandsIDs release];
[super dealloc];
}
-(NSArray *) loadBrandsIDs
{
[self loadBrandsDB];
[brandsIDs release];
brandsIDs = [[FairPriceDB getBrandIDs]copy];
[brandsRecords release];
**brandsRecords = [[FairPriceDB getBrandIDs_NSDictionary]copy];**
[FairPriceDB release];
FairPriceDB = nil;
return brandsIDs;
}
- (FairPriceDatabaseView *) loadBrandsDB {
if (!FairPriceDB)
FairPriceDB = [[FairPriceDatabaseView alloc] initWithFairPriceDatabaseViewFilename:@"b.db"];
return FairPriceDB;
}
При тестировании я получаю утечку памяти в звездной строке (brandsRecords = [[FairPriceDB getBrandIDs_NSDictionary]copy];
)
происходит утечка памяти, когда я меняю tableviewcontroller и возвращаюсь к этим tableviewcontrollers ....
Я хочу знать, правильно ли я поступаю? Почему есть утечка?
Кроме того, каждый раз, когда я выпускаю NSMutableDictionary
, мне также нужно освобождать субдискретарий, который там содержится или нет?
FairPriceDataBaseViewController.h (класс-оболочка)
@interface FairPriceDatabaseView {
NSMutableArray * idList;
NSMutableDictionary * recordList;
}
FairPriceDataBaseViewController.m (класс-оболочка)
- (NSArray *) getBrandIDs {
NSDictionary * row;
[idList removeAllObjects]; // reset the array
for (row in [self getQuery:@"SELECT productID,brandName FROM product GROUP BY brandName;"])
[idList addObject:[row objectForKey:@"productID"]];
return idList;
}
-(NSDictionary *) getBrandIDs_NSDictionary{
[recordList removeAllObjects];
[idList removeAllObjects];
[self getBrandIDs];
NSNumber * rowid;
for(rowid in [self idList])
[recordList setObject:[self getProductRow:rowid] forKey:rowid];
return recordList;
}
- (NSDictionary *) getProductRow: (NSNumber *) rowid {
self.tableName = @"select * from product where productID = ?";
return [self getRow:rowid];
}
-(FairPriceDatabaseView *) initWithFairPriceDatabaseViewFilename: (NSString *) fn
{
if((self = (FairPriceDatabaseView *) [Super initWithDBFilename:fn]))
{
idList = [[NSMutableArray alloc] init];
recordList = [[NSMutableDictionary alloc]init];
}
[self setDefaults];
return self;
}